diff --git a/app/src/main/java/eu/ottop/yamlauncher/AppMenuEdgeFactory.kt b/app/src/main/java/eu/ottop/yamlauncher/AppMenuEdgeFactory.kt
index 98ddd51..32e9c7a 100644
--- a/app/src/main/java/eu/ottop/yamlauncher/AppMenuEdgeFactory.kt
+++ b/app/src/main/java/eu/ottop/yamlauncher/AppMenuEdgeFactory.kt
@@ -1,28 +1,55 @@
package eu.ottop.yamlauncher
+import android.os.Handler
+import android.os.Looper
import android.widget.EdgeEffect
import androidx.recyclerview.widget.RecyclerView
class AppMenuEdgeFactory(private val activity: MainActivity) : RecyclerView.EdgeEffectFactory() {
+ private var isScrollingUp = false
+ private val scrollListener = object : RecyclerView.OnScrollListener() {
+ override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
+ isScrollingUp = dy < 0
+ }
+
+ }
override fun createEdgeEffect(view: RecyclerView, direction: Int): EdgeEffect {
+ view.addOnScrollListener(scrollListener)
return AppMenuEdgeEffect(activity)
}
-}
-class AppMenuEdgeEffect(private val activity: MainActivity) : EdgeEffect(activity) {
- // Adjust the speed here
- private val animationSpeedFactor = 0.5f
- override fun onAbsorb(velocity: Int) {
- super.onAbsorb((velocity * animationSpeedFactor).toInt())
- }
+ inner class AppMenuEdgeEffect(private val activity: MainActivity) : EdgeEffect(activity) {
+ private val animationSpeedFactor = 0.5f
+ private val pullDistanceThreshold = 0.03f // Set a suitable threshold
+ private val debounceInterval = 100L // Milliseconds
+ private var lastActionTime = 0L
- override fun onPull(deltaDistance: Float, displacement: Float) {
- super.onPull(deltaDistance * animationSpeedFactor, displacement)
- activity.showHome()
- }
+ override fun onAbsorb(velocity: Int) {
+ super.onAbsorb((velocity * animationSpeedFactor).toInt())
+ }
- override fun onPullDistance(deltaDistance: Float, displacement: Float): Float {
- return super.onPullDistance(deltaDistance * animationSpeedFactor, displacement)
+ override fun onPull(deltaDistance: Float, displacement: Float) {
+ super.onPull(deltaDistance * animationSpeedFactor, displacement)
+ if (shouldTriggerAction(deltaDistance) && isScrollingUp) {
+ super.onPull(deltaDistance * animationSpeedFactor, displacement)
+ if (activity.recyclerAtTop()) {
+ activity.showHome()
+ }
+ } else {
+ super.onPull(deltaDistance * animationSpeedFactor, displacement)
+ }
+ }
+
+ override fun onPullDistance(deltaDistance: Float, displacement: Float): Float {
+ return super.onPullDistance(deltaDistance * animationSpeedFactor, displacement)
+ }
+
+ private fun shouldTriggerAction(deltaDistance: Float): Boolean {
+ val currentTime = System.currentTimeMillis()
+ return deltaDistance > pullDistanceThreshold && (currentTime - lastActionTime > debounceInterval).also {
+ if (it) lastActionTime = currentTime
+ }
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt b/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt
index 36460ac..aeaa490 100644
--- a/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt
+++ b/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt
@@ -82,6 +82,10 @@ class MainActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener, Ap
}
+ fun recyclerAtTop() : Boolean {
+ return recyclerView.scrollY == 0
+ }
+
private fun setupApps() {
handleListItems()
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 49b81a0..e944c26 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -10,6 +10,10 @@
android:orientation="vertical"
tools:context=".MainActivity">
+
+