Improvements to exiting the app menu

This commit is contained in:
ottoptj 2024-05-27 21:59:50 +03:00
commit e3636bccc7
3 changed files with 48 additions and 13 deletions

View file

@ -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
}
}
}
}

View file

@ -82,6 +82,10 @@ class MainActivity : AppCompatActivity(), AppMenuAdapter.OnItemClickListener, Ap
}
fun recyclerAtTop() : Boolean {
return recyclerView.scrollY == 0
}
private fun setupApps() {
handleListItems()

View file

@ -10,6 +10,10 @@
android:orientation="vertical"
tools:context=".MainActivity">
<ViewSwitcher
android:layout_width="match_parent"
android:layout_height="match_parent" />
<LinearLayout
android:id="@+id/app_view"
android:layout_width="match_parent"