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