1e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar/*
2e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar * Copyright (C) 2015 The Android Open Source Project
3e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar *
4e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
5e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar * you may not use this file except in compliance with the License.
6e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar * You may obtain a copy of the License at
7e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar *
8e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
9e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar *
10e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar * Unless required by applicable law or agreed to in writing, software
11e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
12e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar * See the License for the specific language governing permissions and
14e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar * limitations under the License.
15e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar */
16e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
17e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyarpackage android.support.v7.widget.helper;
18e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
1945d07c8efb62ee378db48884989e5b05b5494981Aurimas Liutikasimport static android.support.v7.widget.helper.ItemTouchHelper.*;
200a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar
2145d07c8efb62ee378db48884989e5b05b5494981Aurimas Liutikasimport static org.junit.Assert.*;
2245d07c8efb62ee378db48884989e5b05b5494981Aurimas Liutikas
2345d07c8efb62ee378db48884989e5b05b5494981Aurimas Liutikasimport android.os.Build;
2445d07c8efb62ee378db48884989e5b05b5494981Aurimas Liutikasimport android.support.test.filters.SdkSuppress;
250a017072206f93474ccd2706e7983c2ff778b904Yigit Boyarimport android.support.test.runner.AndroidJUnit4;
26e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyarimport android.support.v4.view.ViewCompat;
270a017072206f93474ccd2706e7983c2ff778b904Yigit Boyarimport android.support.v7.util.TouchUtils;
28e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyarimport android.support.v7.widget.BaseRecyclerViewInstrumentationTest;
29e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyarimport android.support.v7.widget.RecyclerView;
30e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyarimport android.support.v7.widget.WrappedRecyclerView;
31f1b288ec2104488f4a92e911b0ab80c8f0f3e9d1Yigit Boyarimport android.test.suitebuilder.annotation.MediumTest;
32e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyarimport android.view.Gravity;
33e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyarimport android.view.View;
3445d07c8efb62ee378db48884989e5b05b5494981Aurimas Liutikas
3545d07c8efb62ee378db48884989e5b05b5494981Aurimas Liutikasimport org.junit.Test;
3645d07c8efb62ee378db48884989e5b05b5494981Aurimas Liutikasimport org.junit.runner.RunWith;
37e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
38e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyarimport java.util.ArrayList;
39e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyarimport java.util.List;
40e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
41f1b288ec2104488f4a92e911b0ab80c8f0f3e9d1Yigit Boyar@MediumTest
420a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar@RunWith(AndroidJUnit4.class)
43e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyarpublic class ItemTouchHelperTest extends BaseRecyclerViewInstrumentationTest {
44e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
45e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    TestAdapter mAdapter;
46e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
47e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    TestLayoutManager mLayoutManager;
48e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
49e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    private LoggingCalback mCalback;
50e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
51e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    private LoggingItemTouchHelper mItemTouchHelper;
52e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
53e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    private WrappedRecyclerView mWrappedRecyclerView;
54e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
55e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    private Boolean mSetupRTL;
56e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
57e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    public ItemTouchHelperTest() {
58e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        super(false);
59e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    }
60e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
61e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    private RecyclerView setup(int dragDirs, int swipeDirs) throws Throwable {
62e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        mWrappedRecyclerView = inflateWrappedRV();
63e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        mAdapter = new TestAdapter(10);
64e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        mLayoutManager = new TestLayoutManager() {
65e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            @Override
66e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
67e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                detachAndScrapAttachedViews(recycler);
68e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                layoutRange(recycler, 0, Math.min(5, state.getItemCount()));
69e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                layoutLatch.countDown();
70e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            }
71e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
72e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            @Override
73e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            public boolean canScrollHorizontally() {
74e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                return false;
75e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            }
76e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
77e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            @Override
78e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            public boolean supportsPredictiveItemAnimations() {
79e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                return false;
80e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            }
81e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        };
82e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        mWrappedRecyclerView.setFakeRTL(mSetupRTL);
83e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        mWrappedRecyclerView.setAdapter(mAdapter);
84e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        mWrappedRecyclerView.setLayoutManager(mLayoutManager);
85e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        mCalback = new LoggingCalback(dragDirs, swipeDirs);
86e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        mItemTouchHelper = new LoggingItemTouchHelper(mCalback);
87629687bba8da1a73c48d8fe87393a13581ce46caYigit Boyar        runTestOnUiThread(new Runnable() {
88629687bba8da1a73c48d8fe87393a13581ce46caYigit Boyar            @Override
89629687bba8da1a73c48d8fe87393a13581ce46caYigit Boyar            public void run() {
90629687bba8da1a73c48d8fe87393a13581ce46caYigit Boyar                mItemTouchHelper.attachToRecyclerView(mWrappedRecyclerView);
91629687bba8da1a73c48d8fe87393a13581ce46caYigit Boyar            }
92629687bba8da1a73c48d8fe87393a13581ce46caYigit Boyar        });
93629687bba8da1a73c48d8fe87393a13581ce46caYigit Boyar
94e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        return mWrappedRecyclerView;
95e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    }
96e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
970a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar    @Test
980a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar    public void swipeLeft() throws Throwable {
99e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        basicSwipeTest(LEFT, LEFT | RIGHT, -getActivity().getWindow().getDecorView().getWidth());
100e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    }
101e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
1020a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar    @Test
1030a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar    public void swipeRight() throws Throwable {
104e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        basicSwipeTest(RIGHT, LEFT | RIGHT, getActivity().getWindow().getDecorView().getWidth());
105e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    }
106e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
1070a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar    @Test
1080a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar    public void swipeStart() throws Throwable {
109e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        basicSwipeTest(START, START | END, -getActivity().getWindow().getDecorView().getWidth());
110e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    }
111e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
1120a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar    @Test
1130a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar    public void swipeEnd() throws Throwable {
114e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        basicSwipeTest(END, START | END, getActivity().getWindow().getDecorView().getWidth());
115e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    }
116e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
11745d07c8efb62ee378db48884989e5b05b5494981Aurimas Liutikas    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.JELLY_BEAN_MR1)
1180a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar    @Test
1190a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar    public void swipeStartInRTL() throws Throwable {
120e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        mSetupRTL = true;
121e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        basicSwipeTest(START, START | END, getActivity().getWindow().getDecorView().getWidth());
122e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    }
123e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
12445d07c8efb62ee378db48884989e5b05b5494981Aurimas Liutikas    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.JELLY_BEAN_MR1)
1250a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar    @Test
1260a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar    public void swipeEndInRTL() throws Throwable {
127e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        mSetupRTL = true;
128e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        basicSwipeTest(END, START | END, -getActivity().getWindow().getDecorView().getWidth());
129e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    }
130e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
131e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    private void setLayoutDirection(final View view, final int layoutDir) throws Throwable {
132e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        runTestOnUiThread(new Runnable() {
133e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            @Override
134e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            public void run() {
135e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                ViewCompat.setLayoutDirection(view, layoutDir);
136e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            }
137e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        });
138e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    }
139e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
140e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    public void basicSwipeTest(int dir, int swipeDirs, int targetX) throws Throwable {
141e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        final RecyclerView recyclerView = setup(0, swipeDirs);
142e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        mLayoutManager.expectLayouts(1);
143e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        setRecyclerView(recyclerView);
144e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        mLayoutManager.waitForLayout(1);
145e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
146e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        final RecyclerView.ViewHolder target = mRecyclerView
147e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                .findViewHolderForAdapterPosition(1);
1480a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar        TouchUtils.dragViewToX(getInstrumentation(), target.itemView, Gravity.CENTER, targetX);
149e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        Thread.sleep(100); //wait for animation end
150e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        final SwipeRecord swipe = mCalback.getSwipe(target);
151e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        assertNotNull(swipe);
152e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        assertEquals(dir, swipe.dir);
153e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        assertEquals(1, mItemTouchHelper.mRecoverAnimations.size());
154e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        assertEquals(1, mItemTouchHelper.mPendingCleanup.size());
155e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        // get rid of the view
156e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        mLayoutManager.expectLayouts(1);
157e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        mAdapter.deleteAndNotify(1, 1);
158e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        mLayoutManager.waitForLayout(1);
159e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        waitForAnimations();
160e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        assertEquals(0, mItemTouchHelper.mRecoverAnimations.size());
161e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        assertEquals(0, mItemTouchHelper.mPendingCleanup.size());
162e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        assertTrue(mCalback.isCleared(target));
163e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    }
164e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
165e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    private void waitForAnimations() throws InterruptedException {
166e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        while (mRecyclerView.getItemAnimator().isRunning()) {
167e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            Thread.sleep(100);
168e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
169e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    }
170e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
171e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    private static class LoggingCalback extends SimpleCallback {
172e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
173e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        private List<MoveRecord> mMoveRecordList = new ArrayList<MoveRecord>();
174e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
175e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        private List<SwipeRecord> mSwipeRecords = new ArrayList<SwipeRecord>();
176e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
177e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        private List<RecyclerView.ViewHolder> mCleared = new ArrayList<RecyclerView.ViewHolder>();
178e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
17945d07c8efb62ee378db48884989e5b05b5494981Aurimas Liutikas        LoggingCalback(int dragDirs, int swipeDirs) {
180e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            super(dragDirs, swipeDirs);
181e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
182e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
183e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
184e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
185e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                RecyclerView.ViewHolder target) {
186e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mMoveRecordList.add(new MoveRecord(viewHolder, target));
187e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            return true;
188e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
189e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
190e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
191e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
192e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mSwipeRecords.add(new SwipeRecord(viewHolder, direction));
193e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
194e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
195e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public MoveRecord getMove(RecyclerView.ViewHolder vh) {
196e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            for (MoveRecord move : mMoveRecordList) {
197e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                if (move.from == vh) {
198e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                    return move;
199e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                }
200e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            }
201e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            return null;
202e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
203e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
204e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        @Override
205e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
206e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            super.clearView(recyclerView, viewHolder);
207e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            mCleared.add(viewHolder);
208e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
209e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
210e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public SwipeRecord getSwipe(RecyclerView.ViewHolder vh) {
211e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            for (SwipeRecord swipe : mSwipeRecords) {
212e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                if (swipe.viewHolder == vh) {
213e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                    return swipe;
214e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar                }
215e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            }
216e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            return null;
217e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
218e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
219e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public boolean isCleared(RecyclerView.ViewHolder vh) {
220e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            return mCleared.contains(vh);
221e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
222e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    }
223e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
224e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    private static class LoggingItemTouchHelper extends ItemTouchHelper {
225e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
226e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public LoggingItemTouchHelper(Callback callback) {
227e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            super(callback);
228e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
229e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    }
230e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
231e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    private static class SwipeRecord {
232e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
233e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        RecyclerView.ViewHolder viewHolder;
234e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
235e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        int dir;
236e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
237e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        public SwipeRecord(RecyclerView.ViewHolder viewHolder, int dir) {
238e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            this.viewHolder = viewHolder;
239e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            this.dir = dir;
240e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
241e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    }
242e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
243e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    private static class MoveRecord {
244e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
245e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        final int fromPos, toPos;
246e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
247e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        RecyclerView.ViewHolder from, to;
248e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar
24945d07c8efb62ee378db48884989e5b05b5494981Aurimas Liutikas        MoveRecord(RecyclerView.ViewHolder from, RecyclerView.ViewHolder to) {
250e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            this.from = from;
251e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            this.to = to;
252e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            fromPos = from.getAdapterPosition();
253e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar            toPos = to.getAdapterPosition();
254e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar        }
255e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar    }
256e71a1df9b3c0e1bd3c21a1b3dd20a41790d4a950Yigit Boyar}
257