From 6b15d713e72451bd72ca3538236d050a0eacb45a Mon Sep 17 00:00:00 2001 From: manas-yu Date: Thu, 30 Jan 2025 15:51:19 +0530 Subject: [PATCH] requested changes --- .../state/DragDropSortInteractionView.kt | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/oppia/android/app/player/state/DragDropSortInteractionView.kt b/app/src/main/java/org/oppia/android/app/player/state/DragDropSortInteractionView.kt index bcbe6f0c45a..5b0f8caa5a0 100644 --- a/app/src/main/java/org/oppia/android/app/player/state/DragDropSortInteractionView.kt +++ b/app/src/main/java/org/oppia/android/app/player/state/DragDropSortInteractionView.kt @@ -8,7 +8,9 @@ import android.view.ViewConfiguration import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager +import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LiveData +import androidx.lifecycle.Observer import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView import org.oppia.android.app.player.state.itemviewmodel.DragDropInteractionContentViewModel @@ -52,8 +54,11 @@ class DragDropSortInteractionView @JvmOverloads constructor( private lateinit var onDragEnd: OnDragEndedListener private lateinit var onItemDrag: OnItemDragListener private var itemTouchHelper: ItemTouchHelper? = null + private val fragment: Fragment by lazy { + FragmentManager.findFragment(this@DragDropSortInteractionView) + } companion object { - private const val LONG_PRESS_TIMEOUT_MS = 30L + private const val LONG_PRESS_TIMEOUT_MS = 300L } private val touchListener = object : OnItemTouchListener { @@ -63,8 +68,6 @@ class DragDropSortInteractionView @JvmOverloads constructor( private var currentTimer: LiveData? = null override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean { - val fragment = FragmentManager.findFragment(this@DragDropSortInteractionView) - when (e.action) { MotionEvent.ACTION_DOWN -> { startX = e.x @@ -73,13 +76,12 @@ class DragDropSortInteractionView @JvmOverloads constructor( fragment.let { fragmentOwner -> currentTimer = lifecycleSafeTimerFactory.createTimer(LONG_PRESS_TIMEOUT_MS).apply { - observe(fragmentOwner.viewLifecycleOwner) { + observeOnce(fragmentOwner.viewLifecycleOwner) { findChildViewUnder(startX, startY)?.let { childView -> findContainingViewHolder(childView)?.let { viewHolder -> itemTouchHelper?.startDrag(viewHolder) } } - removeObservers(fragmentOwner.viewLifecycleOwner) } } } @@ -95,9 +97,18 @@ class DragDropSortInteractionView @JvmOverloads constructor( } return false } - + private fun LiveData.observeOnce(owner: LifecycleOwner, observer: Observer) { + observe( + owner, + object : Observer { + override fun onChanged(t: T?) { + observer.onChanged(t) + removeObserver(this) + } + } + ) + } private fun cancelCurrentTimer() { - val fragment = FragmentManager.findFragment(this@DragDropSortInteractionView) currentTimer?.let { timer -> fragment.viewLifecycleOwner.let { lifecycleOwner -> timer.removeObservers(lifecycleOwner)