aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorAllan Wang <me@allanwang.ca>2019-09-22 22:10:16 -0700
committerGitHub <noreply@github.com>2019-09-22 22:10:16 -0700
commitcd4799b7b93c542e1d8204a32b6d43df7e5d1191 (patch)
tree70945ddab3e46fae987943fb66af9249834c8fde /core
parentbfba246d84aa6a22bc02837f9fcbd97780867d10 (diff)
parent996f111dbd36b636d004f0706b88c5b1e31af246 (diff)
downloadkau-cd4799b7b93c542e1d8204a32b6d43df7e5d1191.tar.gz
kau-cd4799b7b93c542e1d8204a32b6d43df7e5d1191.tar.bz2
kau-cd4799b7b93c542e1d8204a32b6d43df7e5d1191.zip
Merge pull request #222 from AllanWang/swipe-enhancement
Swipe enhancement
Diffstat (limited to 'core')
-rw-r--r--core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackHelper.kt17
-rw-r--r--core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackLayout.kt42
-rw-r--r--core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackPage.kt5
3 files changed, 35 insertions, 29 deletions
diff --git a/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackHelper.kt b/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackHelper.kt
index 0cb6935..a8c71a4 100644
--- a/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackHelper.kt
+++ b/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackHelper.kt
@@ -34,8 +34,12 @@ internal object SwipeBackHelper {
private operator fun get(activity: Activity): SwipeBackPage? =
pageStack.firstOrNull { it.activityRef.get() === activity }
- fun onCreate(activity: Activity, builder: SwipeBackContract.() -> Unit = {}) {
- val page = this[activity] ?: pageStack.push(SwipeBackPage(activity).apply { builder() })
+ fun onCreate(
+ activity: Activity,
+ builder: SwipeBackContract.() -> Unit = {}
+ ): SwipeBackContract {
+ val swipeBackPage = SwipeBackPage(activity).apply(builder)
+ val page = this[activity] ?: pageStack.push(swipeBackPage)
val startAnimation: Int = when (page.edgeFlag) {
SWIPE_EDGE_LEFT -> R.anim.kau_slide_in_right
SWIPE_EDGE_RIGHT -> R.anim.kau_slide_in_left
@@ -45,6 +49,7 @@ internal object SwipeBackHelper {
activity.overridePendingTransition(startAnimation, 0)
page.onPostCreate()
KL.v { "KauSwipe onCreate ${activity.localClassName}" }
+ return swipeBackPage
}
fun onDestroy(activity: Activity) {
@@ -73,13 +78,17 @@ internal object SwipeBackHelper {
*
* Lastly, don't forget to call [kauSwipeOnDestroy] as well when the activity is destroyed.
*/
-fun Activity.kauSwipeOnCreate(builder: SwipeBackContract.() -> Unit = {}) = SwipeBackHelper.onCreate(this, builder)
+fun Activity.kauSwipeOnCreate(builder: SwipeBackContract.() -> Unit = {}): SwipeBackContract =
+ SwipeBackHelper.onCreate(this, builder)
/**
* Deprecated as onPostCreate seems unreliable.
* We will instead initialize everything during [kauSwipeOnCreate]
*/
-@Deprecated(level = DeprecationLevel.WARNING, message = "All functionality has been moved to kauSwipeOnCreate")
+@Deprecated(
+ level = DeprecationLevel.WARNING,
+ message = "All functionality has been moved to kauSwipeOnCreate"
+)
fun Activity.kauSwipeOnPostCreate() {
}
diff --git a/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackLayout.kt b/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackLayout.kt
index 921cd1f..bf6d09d 100644
--- a/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackLayout.kt
+++ b/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackLayout.kt
@@ -30,6 +30,9 @@ import ca.allanwang.kau.utils.adjustAlpha
import ca.allanwang.kau.utils.navigationBarColor
import ca.allanwang.kau.utils.statusBarColor
import java.lang.ref.WeakReference
+import kotlin.math.abs
+import kotlin.math.max
+import kotlin.math.min
/**
* The layout that handles all the touch events
@@ -165,12 +168,8 @@ internal class SwipeBackLayout @JvmOverloads constructor(
init {
dragHelper = ViewDragHelper.create(this, ViewDragCallback())
- val density = resources.displayMetrics.density
- val minVel = MIN_FLING_VELOCITY * density
// allow touch from anywhere on the screen
- edgeSize = Math.max(resources.displayMetrics.widthPixels, resources.displayMetrics.heightPixels)
- minVelocity = minVel
-// maxVelocity = 2.5f * minVel
+ edgeSize = max(resources.displayMetrics.widthPixels, resources.displayMetrics.heightPixels)
edgeFlag = edgeFlag
sensitivity = 0.3f
addListener(chromeFadeListener)
@@ -244,19 +243,18 @@ internal class SwipeBackLayout @JvmOverloads constructor(
}
override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
- if (!swipeEnabled || disallowIntercept) {
- return false
- }
+ if (!swipeEnabled || disallowIntercept) return false
return try {
dragHelper.shouldInterceptTouchEvent(event)
} catch (e: Exception) {
false
+
}
}
@SuppressLint("ClickableViewAccessibility")
override fun onTouchEvent(event: MotionEvent): Boolean {
- if (!swipeEnabled) return false
+ if (!swipeEnabled || disallowIntercept) return false
try {
dragHelper.processTouchEvent(event)
} catch (e: Exception) {
@@ -372,10 +370,8 @@ internal class SwipeBackLayout @JvmOverloads constructor(
val contentView = contentViewRef.get()
?: return KL.e { "KauSwipe cannot change view position as contentView is null; is onPostCreate called?" }
// make sure that we are using the proper axis
- scrollPercent = Math.abs(
- if (horizontal) left.toFloat() / contentView.width
- else (top.toFloat() / contentView.height)
- )
+ scrollPercent = abs(if (horizontal) left.toFloat() / contentView.width
+ else (top.toFloat() / contentView.height))
contentOffset = if (horizontal) left else top
invalidate()
if (scrollPercent < scrollThreshold && !isScrollOverValid)
@@ -400,10 +396,10 @@ internal class SwipeBackLayout @JvmOverloads constructor(
var result = Pair(0, 0)
if (scrollPercent <= scrollThreshold) {
// threshold not met; check velocities
- if ((edgeFlag == SWIPE_EDGE_LEFT && xvel > MIN_FLING_VELOCITY) ||
- (edgeFlag == SWIPE_EDGE_RIGHT && xvel < -MIN_FLING_VELOCITY) ||
- (edgeFlag == SWIPE_EDGE_TOP && yvel > MIN_FLING_VELOCITY) ||
- (edgeFlag == SWIPE_EDGE_BOTTOM && yvel < -MIN_FLING_VELOCITY)
+ if ((edgeFlag == SWIPE_EDGE_LEFT && xvel > minVelocity) ||
+ (edgeFlag == SWIPE_EDGE_RIGHT && xvel < -minVelocity) ||
+ (edgeFlag == SWIPE_EDGE_TOP && yvel > minVelocity) ||
+ (edgeFlag == SWIPE_EDGE_BOTTOM && yvel < -minVelocity)
)
result = exitCaptureOffsets(edgeFlag, releasedChild)
} else {
@@ -428,26 +424,22 @@ internal class SwipeBackLayout @JvmOverloads constructor(
override fun clampViewPositionHorizontal(child: View, left: Int, dx: Int): Int {
return when (edgeFlag) {
- SWIPE_EDGE_RIGHT -> Math.min(0, Math.max(left, -child.width))
- SWIPE_EDGE_LEFT -> Math.min(child.width, Math.max(left, 0))
+ SWIPE_EDGE_RIGHT -> min(0, max(left, -child.width))
+ SWIPE_EDGE_LEFT -> min(child.width, max(left, 0))
else -> 0
}
}
override fun clampViewPositionVertical(child: View, top: Int, dy: Int): Int {
return when (edgeFlag) {
- SWIPE_EDGE_BOTTOM -> Math.min(0, Math.max(top, -child.height))
- SWIPE_EDGE_TOP -> Math.min(child.height, Math.max(top, 0))
+ SWIPE_EDGE_BOTTOM -> min(0, max(top, -child.height))
+ SWIPE_EDGE_TOP -> min(child.height, max(top, 0))
else -> 0
}
}
}
companion object {
- /**
- * Minimum velocity that will be detected as a fling
- */
- const val MIN_FLING_VELOCITY = 400 // dips per second
const val DEFAULT_SCRIM_COLOR = 0x99000000.toInt()
diff --git a/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackPage.kt b/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackPage.kt
index bc5b459..c85625a 100644
--- a/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackPage.kt
+++ b/core/src/main/kotlin/ca/allanwang/kau/swipe/SwipeBackPage.kt
@@ -75,6 +75,7 @@ internal interface SwipeBackContractInternal : SwipeBackContract {
interface SwipeBackContract {
/**
* Toggle main touch intercept
+ * Disabling will remove the swipe back handler
*/
var swipeEnabled: Boolean
/**
@@ -91,6 +92,10 @@ interface SwipeBackContract {
* Set the scrolling threshold for wish a page is deemed closing
*/
var scrollThreshold: Float
+ /**
+ * Toggle main touch intercept
+ * Disabling will just ignore touch events, but the handler will remain attached
+ */
var disallowIntercept: Boolean
/**
* Set the min velocity of the view drag helper