@@ -24,6 +24,7 @@ import android.util.AttributeSet
24
24
import android.view.LayoutInflater
25
25
import android.view.MotionEvent
26
26
import android.view.View
27
+ import android.view.ViewConfiguration
27
28
import android.widget.LinearLayout
28
29
import android.widget.PopupWindow
29
30
import androidx.core.text.HtmlCompat
@@ -77,6 +78,7 @@ import com.duckduckgo.savedsites.impl.newtab.FavouritesNewTabSectionViewModel.Co
77
78
import com.duckduckgo.savedsites.impl.newtab.FavouritesNewTabSectionViewModel.Command.DeleteSavedSiteConfirmation
78
79
import com.duckduckgo.savedsites.impl.newtab.FavouritesNewTabSectionViewModel.Command.ShowEditSavedSiteDialog
79
80
import com.duckduckgo.savedsites.impl.newtab.FavouritesNewTabSectionViewModel.SavedSiteChangedViewState
81
+ import com.duckduckgo.savedsites.impl.newtab.FavouritesNewTabSectionViewModel.SwipeDecision
80
82
import com.duckduckgo.savedsites.impl.newtab.FavouritesNewTabSectionViewModel.ViewState
81
83
import com.duckduckgo.savedsites.impl.newtab.FavouritesNewTabSectionsAdapter.Companion.QUICK_ACCESS_GRID_MAX_COLUMNS
82
84
import com.duckduckgo.savedsites.impl.newtab.FavouritesNewTabSectionsAdapter.Companion.QUICK_ACCESS_ITEM_MAX_SIZE_DP
@@ -134,6 +136,14 @@ class FavouritesNewTabSectionView @JvmOverloads constructor(
134
136
private val conflatedStateJob = ConflatedJob ()
135
137
private val conflatedCommandJob = ConflatedJob ()
136
138
139
+ private val touchSlop: Int by lazy { ViewConfiguration .get(context).scaledTouchSlop }
140
+ private val longPressTimeoutMs: Long by lazy { ViewConfiguration .getLongPressTimeout().toLong() }
141
+
142
+ private val longPressRunnable = Runnable {
143
+ viewModel.onLongPressTriggered()
144
+ parent?.requestDisallowInterceptTouchEvent(true )
145
+ }
146
+
137
147
init {
138
148
context.obtainStyledAttributes(
139
149
attrs,
@@ -186,8 +196,35 @@ class FavouritesNewTabSectionView @JvmOverloads constructor(
186
196
}
187
197
188
198
override fun dispatchTouchEvent (ev : MotionEvent ? ): Boolean {
189
- if (swipingTabsFeature.isEnabled) {
190
- parent.requestDisallowInterceptTouchEvent(true )
199
+ if (! swipingTabsFeature.isEnabled) return super .dispatchTouchEvent(ev)
200
+
201
+ when (ev?.actionMasked) {
202
+ MotionEvent .ACTION_DOWN -> {
203
+ viewModel.onTouchDown(ev.x, ev.y)
204
+ removeCallbacks(longPressRunnable)
205
+ postDelayed(longPressRunnable, longPressTimeoutMs)
206
+ parent?.requestDisallowInterceptTouchEvent(false )
207
+ }
208
+
209
+ MotionEvent .ACTION_MOVE -> {
210
+ if (viewModel.isLongPressActive()) {
211
+ parent?.requestDisallowInterceptTouchEvent(true )
212
+ } else {
213
+ viewModel.onTouchMove(ev.x, ev.y, touchSlop)?.let { decision ->
214
+ when (decision) {
215
+ SwipeDecision .CANCEL_LONG_PRESS -> removeCallbacks(longPressRunnable)
216
+ SwipeDecision .HORIZONTAL -> parent?.requestDisallowInterceptTouchEvent(false )
217
+ SwipeDecision .VERTICAL -> parent?.requestDisallowInterceptTouchEvent(true )
218
+ }
219
+ }
220
+ }
221
+ }
222
+
223
+ MotionEvent .ACTION_UP , MotionEvent .ACTION_CANCEL -> {
224
+ removeCallbacks(longPressRunnable)
225
+ viewModel.onTouchUp()
226
+ parent?.requestDisallowInterceptTouchEvent(false )
227
+ }
191
228
}
192
229
return super .dispatchTouchEvent(ev)
193
230
}
0 commit comments