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"> + +