14ff305ec802edbcc05573350895024ec0fab8639Steve McKay/* 24ff305ec802edbcc05573350895024ec0fab8639Steve McKay * Copyright 2018 The Android Open Source Project 34ff305ec802edbcc05573350895024ec0fab8639Steve McKay * 44ff305ec802edbcc05573350895024ec0fab8639Steve McKay * Licensed under the Apache License, Version 2.0 (the "License"); 54ff305ec802edbcc05573350895024ec0fab8639Steve McKay * you may not use this file except in compliance with the License. 64ff305ec802edbcc05573350895024ec0fab8639Steve McKay * You may obtain a copy of the License at 74ff305ec802edbcc05573350895024ec0fab8639Steve McKay * 84ff305ec802edbcc05573350895024ec0fab8639Steve McKay * http://www.apache.org/licenses/LICENSE-2.0 94ff305ec802edbcc05573350895024ec0fab8639Steve McKay * 104ff305ec802edbcc05573350895024ec0fab8639Steve McKay * Unless required by applicable law or agreed to in writing, software 114ff305ec802edbcc05573350895024ec0fab8639Steve McKay * distributed under the License is distributed on an "AS IS" BASIS, 124ff305ec802edbcc05573350895024ec0fab8639Steve McKay * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134ff305ec802edbcc05573350895024ec0fab8639Steve McKay * See the License for the specific language governing permissions and 144ff305ec802edbcc05573350895024ec0fab8639Steve McKay * limitations under the License. 154ff305ec802edbcc05573350895024ec0fab8639Steve McKay */ 164ff305ec802edbcc05573350895024ec0fab8639Steve McKay 174ff305ec802edbcc05573350895024ec0fab8639Steve McKaypackage androidx.recyclerview.selection; 184ff305ec802edbcc05573350895024ec0fab8639Steve McKay 194ff305ec802edbcc05573350895024ec0fab8639Steve McKayimport static androidx.core.util.Preconditions.checkArgument; 204ff305ec802edbcc05573350895024ec0fab8639Steve McKay 214ff305ec802edbcc05573350895024ec0fab8639Steve McKayimport android.view.MotionEvent; 224ff305ec802edbcc05573350895024ec0fab8639Steve McKay 234ff305ec802edbcc05573350895024ec0fab8639Steve McKayimport androidx.annotation.Nullable; 244ff305ec802edbcc05573350895024ec0fab8639Steve McKayimport androidx.recyclerview.widget.RecyclerView; 254ff305ec802edbcc05573350895024ec0fab8639Steve McKayimport androidx.recyclerview.widget.RecyclerView.OnItemTouchListener; 264ff305ec802edbcc05573350895024ec0fab8639Steve McKay 274ff305ec802edbcc05573350895024ec0fab8639Steve McKay/** 284ff305ec802edbcc05573350895024ec0fab8639Steve McKay * OnItemTouchListener that delegates drag events to a drag listener, 294ff305ec802edbcc05573350895024ec0fab8639Steve McKay * else sends event to fallback {@link OnItemTouchListener}. 304ff305ec802edbcc05573350895024ec0fab8639Steve McKay * 314ff305ec802edbcc05573350895024ec0fab8639Steve McKay * <p>See {@link OnDragInitiatedListener} for details on implementing drag and drop. 324ff305ec802edbcc05573350895024ec0fab8639Steve McKay */ 334ff305ec802edbcc05573350895024ec0fab8639Steve McKayfinal class PointerDragEventInterceptor implements OnItemTouchListener { 344ff305ec802edbcc05573350895024ec0fab8639Steve McKay 354ff305ec802edbcc05573350895024ec0fab8639Steve McKay private final ItemDetailsLookup mEventDetailsLookup; 364ff305ec802edbcc05573350895024ec0fab8639Steve McKay private final OnDragInitiatedListener mDragListener; 374ff305ec802edbcc05573350895024ec0fab8639Steve McKay private @Nullable OnItemTouchListener mDelegate; 384ff305ec802edbcc05573350895024ec0fab8639Steve McKay 394ff305ec802edbcc05573350895024ec0fab8639Steve McKay PointerDragEventInterceptor( 404ff305ec802edbcc05573350895024ec0fab8639Steve McKay ItemDetailsLookup eventDetailsLookup, 414ff305ec802edbcc05573350895024ec0fab8639Steve McKay OnDragInitiatedListener dragListener, 424ff305ec802edbcc05573350895024ec0fab8639Steve McKay @Nullable OnItemTouchListener delegate) { 434ff305ec802edbcc05573350895024ec0fab8639Steve McKay 444ff305ec802edbcc05573350895024ec0fab8639Steve McKay checkArgument(eventDetailsLookup != null); 454ff305ec802edbcc05573350895024ec0fab8639Steve McKay checkArgument(dragListener != null); 464ff305ec802edbcc05573350895024ec0fab8639Steve McKay 474ff305ec802edbcc05573350895024ec0fab8639Steve McKay mEventDetailsLookup = eventDetailsLookup; 484ff305ec802edbcc05573350895024ec0fab8639Steve McKay mDragListener = dragListener; 494ff305ec802edbcc05573350895024ec0fab8639Steve McKay mDelegate = delegate; 504ff305ec802edbcc05573350895024ec0fab8639Steve McKay } 514ff305ec802edbcc05573350895024ec0fab8639Steve McKay 524ff305ec802edbcc05573350895024ec0fab8639Steve McKay @Override 534ff305ec802edbcc05573350895024ec0fab8639Steve McKay public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { 544ff305ec802edbcc05573350895024ec0fab8639Steve McKay if (MotionEvents.isPointerDragEvent(e) && mEventDetailsLookup.inItemDragRegion(e)) { 554ff305ec802edbcc05573350895024ec0fab8639Steve McKay return mDragListener.onDragInitiated(e); 564ff305ec802edbcc05573350895024ec0fab8639Steve McKay } else if (mDelegate != null) { 574ff305ec802edbcc05573350895024ec0fab8639Steve McKay return mDelegate.onInterceptTouchEvent(rv, e); 584ff305ec802edbcc05573350895024ec0fab8639Steve McKay } 594ff305ec802edbcc05573350895024ec0fab8639Steve McKay return false; 604ff305ec802edbcc05573350895024ec0fab8639Steve McKay } 614ff305ec802edbcc05573350895024ec0fab8639Steve McKay 624ff305ec802edbcc05573350895024ec0fab8639Steve McKay @Override 634ff305ec802edbcc05573350895024ec0fab8639Steve McKay public void onTouchEvent(RecyclerView rv, MotionEvent e) { 644ff305ec802edbcc05573350895024ec0fab8639Steve McKay if (mDelegate != null) { 654ff305ec802edbcc05573350895024ec0fab8639Steve McKay mDelegate.onTouchEvent(rv, e); 664ff305ec802edbcc05573350895024ec0fab8639Steve McKay } 674ff305ec802edbcc05573350895024ec0fab8639Steve McKay } 684ff305ec802edbcc05573350895024ec0fab8639Steve McKay 694ff305ec802edbcc05573350895024ec0fab8639Steve McKay @Override 704ff305ec802edbcc05573350895024ec0fab8639Steve McKay public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 714ff305ec802edbcc05573350895024ec0fab8639Steve McKay if (mDelegate != null) { 724ff305ec802edbcc05573350895024ec0fab8639Steve McKay mDelegate.onRequestDisallowInterceptTouchEvent(disallowIntercept); 734ff305ec802edbcc05573350895024ec0fab8639Steve McKay } 744ff305ec802edbcc05573350895024ec0fab8639Steve McKay } 754ff305ec802edbcc05573350895024ec0fab8639Steve McKay} 76