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