You've already forked Magisk
mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-09-06 06:36:58 +00:00
Updated navigation behavior to be consistent and easily manageable
This commit is contained in:
@@ -11,14 +11,17 @@ import com.google.android.material.snackbar.Snackbar
|
||||
import com.topjohnwu.magisk.R
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
class HideBottomViewOnScrollBehavior<T : View> : HideBottomViewOnScrollBehavior<T>() {
|
||||
class HideBottomViewOnScrollBehavior<V : View> : HideBottomViewOnScrollBehavior<V>(),
|
||||
HideableBehavior<V> {
|
||||
|
||||
override fun layoutDependsOn(parent: CoordinatorLayout, child: T, dependency: View) =
|
||||
private var lockState: Boolean = false
|
||||
|
||||
override fun layoutDependsOn(parent: CoordinatorLayout, child: V, dependency: View) =
|
||||
super.layoutDependsOn(parent, child, dependency) or (dependency is Snackbar.SnackbarLayout)
|
||||
|
||||
override fun onDependentViewChanged(
|
||||
parent: CoordinatorLayout,
|
||||
child: T,
|
||||
child: V,
|
||||
dependency: View
|
||||
) = when (dependency) {
|
||||
is Snackbar.SnackbarLayout -> onDependentViewChanged(parent, child, dependency)
|
||||
@@ -27,7 +30,7 @@ class HideBottomViewOnScrollBehavior<T : View> : HideBottomViewOnScrollBehavior<
|
||||
|
||||
override fun onDependentViewRemoved(
|
||||
parent: CoordinatorLayout,
|
||||
child: T,
|
||||
child: V,
|
||||
dependency: View
|
||||
) = when (dependency) {
|
||||
is Snackbar.SnackbarLayout -> onDependentViewRemoved(parent, child, dependency)
|
||||
@@ -38,7 +41,7 @@ class HideBottomViewOnScrollBehavior<T : View> : HideBottomViewOnScrollBehavior<
|
||||
|
||||
private fun onDependentViewChanged(
|
||||
parent: CoordinatorLayout,
|
||||
child: T,
|
||||
child: V,
|
||||
dependency: Snackbar.SnackbarLayout
|
||||
): Boolean {
|
||||
val viewMargin = (child.layoutParams as ViewGroup.MarginLayoutParams).bottomMargin
|
||||
@@ -58,7 +61,7 @@ class HideBottomViewOnScrollBehavior<T : View> : HideBottomViewOnScrollBehavior<
|
||||
|
||||
private fun onDependentViewRemoved(
|
||||
parent: CoordinatorLayout,
|
||||
child: T,
|
||||
child: V,
|
||||
dependency: Snackbar.SnackbarLayout
|
||||
) {
|
||||
// checks whether the navigation is not hidden via scroll
|
||||
@@ -69,6 +72,36 @@ class HideBottomViewOnScrollBehavior<T : View> : HideBottomViewOnScrollBehavior<
|
||||
|
||||
//---
|
||||
|
||||
override fun slideUp(child: V) {
|
||||
if (lockState) return
|
||||
super.slideUp(child)
|
||||
}
|
||||
|
||||
override fun slideDown(child: V) {
|
||||
if (lockState) return
|
||||
super.slideDown(child)
|
||||
}
|
||||
|
||||
override fun setHidden(
|
||||
view: V,
|
||||
hide: Boolean,
|
||||
lockState: Boolean
|
||||
) {
|
||||
if (!lockState) {
|
||||
this.lockState = lockState
|
||||
}
|
||||
|
||||
if (hide) {
|
||||
slideDown(view)
|
||||
} else {
|
||||
slideUp(view)
|
||||
}
|
||||
|
||||
this.lockState = lockState
|
||||
}
|
||||
|
||||
//---
|
||||
|
||||
private fun View.translationY(destination: Float) = animate()
|
||||
.translationY(destination)
|
||||
.setInterpolator(FastOutSlowInInterpolator())
|
||||
|
||||
@@ -10,7 +10,8 @@ import androidx.core.view.ViewCompat
|
||||
import com.google.android.material.animation.AnimationUtils
|
||||
import com.google.android.material.behavior.HideBottomViewOnScrollBehavior
|
||||
|
||||
class HideTopViewOnScrollBehavior<V : View> : HideBottomViewOnScrollBehavior<V>() {
|
||||
class HideTopViewOnScrollBehavior<V : View> : HideBottomViewOnScrollBehavior<V>(),
|
||||
HideableBehavior<V> {
|
||||
|
||||
companion object {
|
||||
private const val STATE_SCROLLED_DOWN = 1
|
||||
@@ -21,6 +22,7 @@ class HideTopViewOnScrollBehavior<V : View> : HideBottomViewOnScrollBehavior<V>(
|
||||
private var currentState = STATE_SCROLLED_UP
|
||||
private var additionalHiddenOffsetY = 0
|
||||
private var currentAnimator: ViewPropertyAnimator? = null
|
||||
private var lockState: Boolean = false
|
||||
|
||||
override fun onLayoutChild(
|
||||
parent: CoordinatorLayout,
|
||||
@@ -63,10 +65,30 @@ class HideTopViewOnScrollBehavior<V : View> : HideBottomViewOnScrollBehavior<V>(
|
||||
dxUnconsumed: Int,
|
||||
dyUnconsumed: Int
|
||||
) {
|
||||
when {
|
||||
dyConsumed > 0 -> slideUp(child)
|
||||
dyConsumed < 0 -> slideDown(child)
|
||||
// when initiating scroll while the view is at the bottom or at the top and pushing it
|
||||
// further, the parent will report consumption of 0
|
||||
if (dyConsumed == 0) return
|
||||
|
||||
setHidden(child, dyConsumed > 0, false)
|
||||
}
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun setHidden(
|
||||
view: V,
|
||||
hide: Boolean,
|
||||
lockState: Boolean
|
||||
) {
|
||||
if (!lockState) {
|
||||
this.lockState = lockState
|
||||
}
|
||||
|
||||
if (hide) {
|
||||
slideUp(view)
|
||||
} else {
|
||||
slideDown(view)
|
||||
}
|
||||
|
||||
this.lockState = lockState
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -74,7 +96,7 @@ class HideTopViewOnScrollBehavior<V : View> : HideBottomViewOnScrollBehavior<V>(
|
||||
* screen.
|
||||
*/
|
||||
override fun slideDown(child: V) {
|
||||
if (currentState == STATE_SCROLLED_UP) {
|
||||
if (currentState == STATE_SCROLLED_UP || lockState) {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -97,7 +119,7 @@ class HideTopViewOnScrollBehavior<V : View> : HideBottomViewOnScrollBehavior<V>(
|
||||
* screen.
|
||||
*/
|
||||
override fun slideUp(child: V) {
|
||||
if (currentState == STATE_SCROLLED_DOWN) {
|
||||
if (currentState == STATE_SCROLLED_DOWN || lockState) {
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.topjohnwu.magisk.utils
|
||||
|
||||
import android.view.View
|
||||
|
||||
interface HideableBehavior<V : View> {
|
||||
|
||||
fun setHidden(view: V, hide: Boolean, lockState: Boolean = false)
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user