15031b30272a0178845f88d06adddb204dd833779Yigit Boyar/* 25031b30272a0178845f88d06adddb204dd833779Yigit Boyar * Copyright (C) 2015 The Android Open Source Project 35031b30272a0178845f88d06adddb204dd833779Yigit Boyar * 45031b30272a0178845f88d06adddb204dd833779Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License"); 55031b30272a0178845f88d06adddb204dd833779Yigit Boyar * you may not use this file except in compliance with the License. 65031b30272a0178845f88d06adddb204dd833779Yigit Boyar * You may obtain a copy of the License at 75031b30272a0178845f88d06adddb204dd833779Yigit Boyar * 85031b30272a0178845f88d06adddb204dd833779Yigit Boyar * http://www.apache.org/licenses/LICENSE-2.0 95031b30272a0178845f88d06adddb204dd833779Yigit Boyar * 105031b30272a0178845f88d06adddb204dd833779Yigit Boyar * Unless required by applicable law or agreed to in writing, software 115031b30272a0178845f88d06adddb204dd833779Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS, 125031b30272a0178845f88d06adddb204dd833779Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135031b30272a0178845f88d06adddb204dd833779Yigit Boyar * See the License for the specific language governing permissions and 145031b30272a0178845f88d06adddb204dd833779Yigit Boyar * limitations under the License. 155031b30272a0178845f88d06adddb204dd833779Yigit Boyar */ 165031b30272a0178845f88d06adddb204dd833779Yigit Boyar 175031b30272a0178845f88d06adddb204dd833779Yigit Boyarpackage android.support.v7.widget; 185031b30272a0178845f88d06adddb204dd833779Yigit Boyar 198052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikasimport static org.junit.Assert.assertEquals; 208052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikasimport static org.junit.Assert.assertFalse; 218052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikasimport static org.junit.Assert.assertNull; 228052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikasimport static org.junit.Assert.assertSame; 238052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikasimport static org.junit.Assert.assertTrue; 245031b30272a0178845f88d06adddb204dd833779Yigit Boyar 258052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikasimport android.content.Context; 265031b30272a0178845f88d06adddb204dd833779Yigit Boyarimport android.support.test.InstrumentationRegistry; 27754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.support.test.filters.SmallTest; 285031b30272a0178845f88d06adddb204dd833779Yigit Boyarimport android.support.test.runner.AndroidJUnit4; 295031b30272a0178845f88d06adddb204dd833779Yigit Boyarimport android.view.View; 305031b30272a0178845f88d06adddb204dd833779Yigit Boyarimport android.view.ViewGroup; 315031b30272a0178845f88d06adddb204dd833779Yigit Boyar 328052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikasimport org.junit.Before; 338052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikasimport org.junit.Test; 348052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikasimport org.junit.runner.RunWith; 358052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikas 365031b30272a0178845f88d06adddb204dd833779Yigit Boyarimport java.util.ArrayList; 375031b30272a0178845f88d06adddb204dd833779Yigit Boyarimport java.util.List; 385031b30272a0178845f88d06adddb204dd833779Yigit Boyar 395031b30272a0178845f88d06adddb204dd833779Yigit Boyar@RunWith(AndroidJUnit4.class) 40f1b288ec2104488f4a92e911b0ab80c8f0f3e9d1Yigit Boyar@SmallTest 418052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikaspublic class ChildHelperTest { 425031b30272a0178845f88d06adddb204dd833779Yigit Boyar LoggingCallback mLoggingCallback; 435031b30272a0178845f88d06adddb204dd833779Yigit Boyar ChildHelper mChildHelper; 448052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikas Context mContext; 455031b30272a0178845f88d06adddb204dd833779Yigit Boyar 465031b30272a0178845f88d06adddb204dd833779Yigit Boyar @Before 478052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikas public void setup() throws Exception { 488052423a9ffce385de32ae76fa962e6316f03677Aurimas Liutikas mContext = InstrumentationRegistry.getContext(); 495031b30272a0178845f88d06adddb204dd833779Yigit Boyar mLoggingCallback = new LoggingCallback(); 505031b30272a0178845f88d06adddb204dd833779Yigit Boyar mChildHelper = new ChildHelper(mLoggingCallback); 515031b30272a0178845f88d06adddb204dd833779Yigit Boyar } 525031b30272a0178845f88d06adddb204dd833779Yigit Boyar 535031b30272a0178845f88d06adddb204dd833779Yigit Boyar private RecyclerView.ViewHolder vh() { 545031b30272a0178845f88d06adddb204dd833779Yigit Boyar View view = new View(mContext); 555031b30272a0178845f88d06adddb204dd833779Yigit Boyar RecyclerViewBasicTest.MockViewHolder mockViewHolder 565031b30272a0178845f88d06adddb204dd833779Yigit Boyar = new RecyclerViewBasicTest.MockViewHolder(view); 575031b30272a0178845f88d06adddb204dd833779Yigit Boyar RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(0 , 0); 585031b30272a0178845f88d06adddb204dd833779Yigit Boyar lp.mViewHolder = mockViewHolder; 595031b30272a0178845f88d06adddb204dd833779Yigit Boyar view.setLayoutParams(lp); 605031b30272a0178845f88d06adddb204dd833779Yigit Boyar return mockViewHolder; 615031b30272a0178845f88d06adddb204dd833779Yigit Boyar } 625031b30272a0178845f88d06adddb204dd833779Yigit Boyar 635031b30272a0178845f88d06adddb204dd833779Yigit Boyar @Test 640a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar public void addChild() { 655031b30272a0178845f88d06adddb204dd833779Yigit Boyar RecyclerView.ViewHolder vh = vh(); 665031b30272a0178845f88d06adddb204dd833779Yigit Boyar mChildHelper.addView(vh.itemView, false); 675031b30272a0178845f88d06adddb204dd833779Yigit Boyar assertEquals(1, mLoggingCallback.getChildCount()); 685031b30272a0178845f88d06adddb204dd833779Yigit Boyar assertFalse(mChildHelper.isHidden(vh.itemView)); 695031b30272a0178845f88d06adddb204dd833779Yigit Boyar assertEquals(0, mLoggingCallback.mOnEnteredHiddenState.size()); 705031b30272a0178845f88d06adddb204dd833779Yigit Boyar } 715031b30272a0178845f88d06adddb204dd833779Yigit Boyar 725031b30272a0178845f88d06adddb204dd833779Yigit Boyar @Test 730a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar public void addChildHidden() { 745031b30272a0178845f88d06adddb204dd833779Yigit Boyar RecyclerView.ViewHolder vh = vh(); 755031b30272a0178845f88d06adddb204dd833779Yigit Boyar mChildHelper.addView(vh.itemView, true); 765031b30272a0178845f88d06adddb204dd833779Yigit Boyar assertEquals(1, mLoggingCallback.getChildCount()); 775031b30272a0178845f88d06adddb204dd833779Yigit Boyar assertTrue(mChildHelper.isHidden(vh.itemView)); 785031b30272a0178845f88d06adddb204dd833779Yigit Boyar assertTrue(mLoggingCallback.mOnEnteredHiddenState.contains(vh.itemView)); 795031b30272a0178845f88d06adddb204dd833779Yigit Boyar } 805031b30272a0178845f88d06adddb204dd833779Yigit Boyar 815031b30272a0178845f88d06adddb204dd833779Yigit Boyar @Test 820a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar public void addChildAndHide() { 835031b30272a0178845f88d06adddb204dd833779Yigit Boyar RecyclerView.ViewHolder vh = vh(); 845031b30272a0178845f88d06adddb204dd833779Yigit Boyar mChildHelper.addView(vh.itemView, false); 855031b30272a0178845f88d06adddb204dd833779Yigit Boyar mChildHelper.hide(vh.itemView); 865031b30272a0178845f88d06adddb204dd833779Yigit Boyar assertTrue(mChildHelper.isHidden(vh.itemView)); 875031b30272a0178845f88d06adddb204dd833779Yigit Boyar mChildHelper.unhide(vh.itemView); 885031b30272a0178845f88d06adddb204dd833779Yigit Boyar assertFalse(mChildHelper.isHidden(vh.itemView)); 895031b30272a0178845f88d06adddb204dd833779Yigit Boyar } 905031b30272a0178845f88d06adddb204dd833779Yigit Boyar 915031b30272a0178845f88d06adddb204dd833779Yigit Boyar @Test 920a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar public void findHiddenNonRemoved() { 935031b30272a0178845f88d06adddb204dd833779Yigit Boyar RecyclerView.ViewHolder vh = vh(); 945031b30272a0178845f88d06adddb204dd833779Yigit Boyar vh.mPosition = 12; 955031b30272a0178845f88d06adddb204dd833779Yigit Boyar mChildHelper.addView(vh.itemView, true); 96a491891f854a05f1ffb979c73e245f0adc58af58Chris Craik assertSame(vh.itemView, mChildHelper.findHiddenNonRemovedView(12)); 975031b30272a0178845f88d06adddb204dd833779Yigit Boyar } 985031b30272a0178845f88d06adddb204dd833779Yigit Boyar 995031b30272a0178845f88d06adddb204dd833779Yigit Boyar @Test 1000a017072206f93474ccd2706e7983c2ff778b904Yigit Boyar public void findHiddenRemoved() { 1015031b30272a0178845f88d06adddb204dd833779Yigit Boyar RecyclerView.ViewHolder vh = vh(); 1025031b30272a0178845f88d06adddb204dd833779Yigit Boyar vh.mPosition = 12; 1035031b30272a0178845f88d06adddb204dd833779Yigit Boyar vh.addFlags(RecyclerView.ViewHolder.FLAG_REMOVED); 1045031b30272a0178845f88d06adddb204dd833779Yigit Boyar mChildHelper.addView(vh.itemView, true); 105a491891f854a05f1ffb979c73e245f0adc58af58Chris Craik assertNull(mChildHelper.findHiddenNonRemovedView(12)); 1065031b30272a0178845f88d06adddb204dd833779Yigit Boyar } 1075031b30272a0178845f88d06adddb204dd833779Yigit Boyar 1085031b30272a0178845f88d06adddb204dd833779Yigit Boyar private static class LoggingCallback implements ChildHelper.Callback { 1095031b30272a0178845f88d06adddb204dd833779Yigit Boyar List<View> mViews = new ArrayList<>(); 1105031b30272a0178845f88d06adddb204dd833779Yigit Boyar List<View> mDetached = new ArrayList<>(); 1115031b30272a0178845f88d06adddb204dd833779Yigit Boyar List<View> mOnEnteredHiddenState = new ArrayList<>(); 1125031b30272a0178845f88d06adddb204dd833779Yigit Boyar List<View> mOnExitedHiddenState = new ArrayList<>(); 1135031b30272a0178845f88d06adddb204dd833779Yigit Boyar @Override 1145031b30272a0178845f88d06adddb204dd833779Yigit Boyar public int getChildCount() { 1155031b30272a0178845f88d06adddb204dd833779Yigit Boyar return mViews.size(); 1165031b30272a0178845f88d06adddb204dd833779Yigit Boyar } 1175031b30272a0178845f88d06adddb204dd833779Yigit Boyar 1185031b30272a0178845f88d06adddb204dd833779Yigit Boyar @Override 1195031b30272a0178845f88d06adddb204dd833779Yigit Boyar public void addView(View child, int index) { 1205031b30272a0178845f88d06adddb204dd833779Yigit Boyar mViews.add(index, child); 1215031b30272a0178845f88d06adddb204dd833779Yigit Boyar } 1225031b30272a0178845f88d06adddb204dd833779Yigit Boyar 1235031b30272a0178845f88d06adddb204dd833779Yigit Boyar @Override 1245031b30272a0178845f88d06adddb204dd833779Yigit Boyar public int indexOfChild(View view) { 1255031b30272a0178845f88d06adddb204dd833779Yigit Boyar return mViews.indexOf(view); 1265031b30272a0178845f88d06adddb204dd833779Yigit Boyar } 1275031b30272a0178845f88d06adddb204dd833779Yigit Boyar 1285031b30272a0178845f88d06adddb204dd833779Yigit Boyar private boolean validateIndex(int index) { 1295031b30272a0178845f88d06adddb204dd833779Yigit Boyar return index < getChildCount() && index >= 0; 1305031b30272a0178845f88d06adddb204dd833779Yigit Boyar } 1315031b30272a0178845f88d06adddb204dd833779Yigit Boyar 1325031b30272a0178845f88d06adddb204dd833779Yigit Boyar @Override 1335031b30272a0178845f88d06adddb204dd833779Yigit Boyar public void removeViewAt(int index) { 1345031b30272a0178845f88d06adddb204dd833779Yigit Boyar if (validateIndex(index)) { 1355031b30272a0178845f88d06adddb204dd833779Yigit Boyar mViews.remove(index); 1365031b30272a0178845f88d06adddb204dd833779Yigit Boyar } 1375031b30272a0178845f88d06adddb204dd833779Yigit Boyar } 1385031b30272a0178845f88d06adddb204dd833779Yigit Boyar 1395031b30272a0178845f88d06adddb204dd833779Yigit Boyar @Override 1405031b30272a0178845f88d06adddb204dd833779Yigit Boyar public View getChildAt(int offset) { 1415031b30272a0178845f88d06adddb204dd833779Yigit Boyar if (validateIndex(offset)) { 1425031b30272a0178845f88d06adddb204dd833779Yigit Boyar return mViews.remove(offset); 1435031b30272a0178845f88d06adddb204dd833779Yigit Boyar } 1445031b30272a0178845f88d06adddb204dd833779Yigit Boyar return null; 1455031b30272a0178845f88d06adddb204dd833779Yigit Boyar } 1465031b30272a0178845f88d06adddb204dd833779Yigit Boyar 1475031b30272a0178845f88d06adddb204dd833779Yigit Boyar @Override 1485031b30272a0178845f88d06adddb204dd833779Yigit Boyar public void removeAllViews() { 1495031b30272a0178845f88d06adddb204dd833779Yigit Boyar mViews.clear(); 1505031b30272a0178845f88d06adddb204dd833779Yigit Boyar } 1515031b30272a0178845f88d06adddb204dd833779Yigit Boyar 1525031b30272a0178845f88d06adddb204dd833779Yigit Boyar @Override 1535031b30272a0178845f88d06adddb204dd833779Yigit Boyar public RecyclerView.ViewHolder getChildViewHolder(View view) { 1545031b30272a0178845f88d06adddb204dd833779Yigit Boyar return RecyclerView.getChildViewHolderInt(view); 1555031b30272a0178845f88d06adddb204dd833779Yigit Boyar } 1565031b30272a0178845f88d06adddb204dd833779Yigit Boyar 1575031b30272a0178845f88d06adddb204dd833779Yigit Boyar @Override 1585031b30272a0178845f88d06adddb204dd833779Yigit Boyar public void attachViewToParent(View child, int index, ViewGroup.LayoutParams layoutParams) { 1595031b30272a0178845f88d06adddb204dd833779Yigit Boyar assertTrue(mDetached.remove(child)); 1605031b30272a0178845f88d06adddb204dd833779Yigit Boyar addView(child, index); 1615031b30272a0178845f88d06adddb204dd833779Yigit Boyar } 1625031b30272a0178845f88d06adddb204dd833779Yigit Boyar 1635031b30272a0178845f88d06adddb204dd833779Yigit Boyar @Override 1645031b30272a0178845f88d06adddb204dd833779Yigit Boyar public void detachViewFromParent(int offset) { 1655031b30272a0178845f88d06adddb204dd833779Yigit Boyar mDetached.add(getChildAt(offset)); 1665031b30272a0178845f88d06adddb204dd833779Yigit Boyar } 1675031b30272a0178845f88d06adddb204dd833779Yigit Boyar 1685031b30272a0178845f88d06adddb204dd833779Yigit Boyar @Override 1695031b30272a0178845f88d06adddb204dd833779Yigit Boyar public void onEnteredHiddenState(View child) { 1705031b30272a0178845f88d06adddb204dd833779Yigit Boyar mOnEnteredHiddenState.add(child); 1715031b30272a0178845f88d06adddb204dd833779Yigit Boyar } 1725031b30272a0178845f88d06adddb204dd833779Yigit Boyar 1735031b30272a0178845f88d06adddb204dd833779Yigit Boyar @Override 1745031b30272a0178845f88d06adddb204dd833779Yigit Boyar public void onLeftHiddenState(View child) { 1755031b30272a0178845f88d06adddb204dd833779Yigit Boyar mOnExitedHiddenState.add(child); 1765031b30272a0178845f88d06adddb204dd833779Yigit Boyar } 1775031b30272a0178845f88d06adddb204dd833779Yigit Boyar } 1785031b30272a0178845f88d06adddb204dd833779Yigit Boyar} 179