summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
Diffstat (limited to 'android')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/widget/CustomItemAnimator.kt37
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/widget/CustomRecyclerView.kt12
2 files changed, 49 insertions, 0 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/widget/CustomItemAnimator.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/widget/CustomItemAnimator.kt
new file mode 100644
index 0000000000..e35f4283b2
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/widget/CustomItemAnimator.kt
@@ -0,0 +1,37 @@
+package net.mullvad.mullvadvpn.ui.widget
+
+import android.support.v7.widget.DefaultItemAnimator
+import android.support.v7.widget.RecyclerView.ViewHolder
+import kotlin.math.round
+
+class CustomItemAnimator : DefaultItemAnimator() {
+ var onMove: ((Int, Int) -> Unit)? = null
+
+ override fun animateMove(
+ holder: ViewHolder,
+ fromX: Int,
+ fromY: Int,
+ toX: Int,
+ toY: Int
+ ): Boolean {
+ if (super.animateMove(holder, fromX, fromY, toX, toY)) {
+ var view = holder.itemView
+ var translationX = view.translationX
+ var translationY = view.translationY
+
+ view.animate().setUpdateListener { _ ->
+ val deltaX = round(translationX - view.translationX)
+ val deltaY = round(translationY - view.translationY)
+
+ onMove?.invoke(deltaX.toInt(), deltaY.toInt())
+
+ translationX -= deltaX
+ translationY -= deltaY
+ }
+
+ return true
+ } else {
+ return false
+ }
+ }
+}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/widget/CustomRecyclerView.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/widget/CustomRecyclerView.kt
index 710bb834d0..ac97b4d831 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/widget/CustomRecyclerView.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/widget/CustomRecyclerView.kt
@@ -19,9 +19,21 @@ class CustomRecyclerView : RecyclerView, ListenableScrollableView {
super(context, attributes, defaultStyleAttribute) {
}
+ init {
+ itemAnimator = CustomItemAnimator().apply {
+ onMove = { horizontalDelta, verticalDelta ->
+ dispatchScrollEvent(horizontalDelta, verticalDelta)
+ }
+ }
+ }
+
override fun onScrolled(horizontalDelta: Int, verticalDelta: Int) {
super.onScrolled(horizontalDelta, verticalDelta)
+ dispatchScrollEvent(horizontalDelta, verticalDelta)
+ }
+
+ private fun dispatchScrollEvent(horizontalDelta: Int, verticalDelta: Int) {
val oldHorizontalScrollOffset = horizontalScrollOffset
val oldVerticalScrollOffset = verticalScrollOffset