Home | History | Annotate | Download | only in widget
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  * Licensed under the Apache License, Version 2.0 (the "License");
      4  * you may not use this file except in compliance with the License.
      5  * You may obtain a copy of the License at
      6  *      http://www.apache.org/licenses/LICENSE-2.0
      7  * Unless required by applicable law or agreed to in writing, software
      8  * distributed under the License is distributed on an "AS IS" BASIS,
      9  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     10  * See the License for the specific language governing permissions and
     11  * limitations under the License.
     12  */
     13 
     14 package android.support.v7.widget;
     15 
     16 import android.support.annotation.NonNull;
     17 
     18 import java.util.ArrayList;
     19 import java.util.List;
     20 import java.util.concurrent.CountDownLatch;
     21 import java.util.concurrent.TimeUnit;
     22 import android.support.v7.widget.BaseRecyclerViewAnimationsTest.AnimateDisappearance;
     23 import android.support.v7.widget.BaseRecyclerViewAnimationsTest.AnimateChange;
     24 import android.support.v7.widget.BaseRecyclerViewAnimationsTest.AnimatePersistence;
     25 import android.support.v7.widget.BaseRecyclerViewAnimationsTest.AnimateAppearance;
     26 
     27 public class LoggingItemAnimator extends DefaultItemAnimator {
     28 
     29     final ArrayList<RecyclerView.ViewHolder> mAddVHs = new ArrayList<RecyclerView.ViewHolder>();
     30 
     31     final ArrayList<RecyclerView.ViewHolder> mRemoveVHs = new ArrayList<RecyclerView.ViewHolder>();
     32 
     33     final ArrayList<RecyclerView.ViewHolder> mMoveVHs = new ArrayList<RecyclerView.ViewHolder>();
     34 
     35     final ArrayList<RecyclerView.ViewHolder> mChangeOldVHs = new ArrayList<RecyclerView.ViewHolder>();
     36 
     37     final ArrayList<RecyclerView.ViewHolder> mChangeNewVHs = new ArrayList<RecyclerView.ViewHolder>();
     38 
     39     List<AnimateAppearance> mAnimateAppearanceList = new ArrayList<>();
     40     List<AnimateDisappearance> mAnimateDisappearanceList = new ArrayList<>();
     41     List<AnimatePersistence> mAnimatePersistenceList = new ArrayList<>();
     42     List<AnimateChange> mAnimateChangeList = new ArrayList<>();
     43 
     44     CountDownLatch mWaitForPendingAnimations;
     45 
     46     public boolean contains(RecyclerView.ViewHolder viewHolder,
     47             List<? extends BaseRecyclerViewAnimationsTest.AnimateLogBase> list) {
     48         for (BaseRecyclerViewAnimationsTest.AnimateLogBase log : list) {
     49             if (log.viewHolder == viewHolder) {
     50                 return true;
     51             }
     52             if (log instanceof AnimateChange) {
     53                 if (((AnimateChange) log).newHolder == viewHolder) {
     54                     return true;
     55                 }
     56             }
     57         }
     58         return false;
     59     }
     60 
     61     @NonNull
     62     @Override
     63     public ItemHolderInfo recordPreLayoutInformation(@NonNull RecyclerView.State state,
     64             @NonNull RecyclerView.ViewHolder viewHolder,
     65             @AdapterChanges int changeFlags, @NonNull List<Object> payloads) {
     66         BaseRecyclerViewAnimationsTest.LoggingInfo
     67                 loggingInfo = new BaseRecyclerViewAnimationsTest.LoggingInfo(viewHolder, changeFlags, payloads);
     68         return loggingInfo;
     69     }
     70 
     71     @NonNull
     72     @Override
     73     public ItemHolderInfo recordPostLayoutInformation(@NonNull RecyclerView.State state,
     74             @NonNull RecyclerView.ViewHolder viewHolder) {
     75         BaseRecyclerViewAnimationsTest.LoggingInfo
     76                 loggingInfo = new BaseRecyclerViewAnimationsTest.LoggingInfo(viewHolder, 0, null);
     77         return loggingInfo;
     78     }
     79 
     80 
     81     @Override
     82     public boolean animateDisappearance(@NonNull RecyclerView.ViewHolder viewHolder,
     83             @NonNull ItemHolderInfo preLayoutInfo, ItemHolderInfo postLayoutInfo) {
     84         mAnimateDisappearanceList
     85                 .add(new AnimateDisappearance(viewHolder,
     86                         (BaseRecyclerViewAnimationsTest.LoggingInfo) preLayoutInfo,
     87                         (BaseRecyclerViewAnimationsTest.LoggingInfo) postLayoutInfo));
     88         return super.animateDisappearance(viewHolder, preLayoutInfo, postLayoutInfo);
     89     }
     90 
     91     @Override
     92     public boolean animateAppearance(@NonNull RecyclerView.ViewHolder viewHolder,
     93             ItemHolderInfo preLayoutInfo,
     94             @NonNull ItemHolderInfo postLayoutInfo) {
     95         mAnimateAppearanceList
     96                 .add(new AnimateAppearance(viewHolder,
     97                         (BaseRecyclerViewAnimationsTest.LoggingInfo) preLayoutInfo,
     98                         (BaseRecyclerViewAnimationsTest.LoggingInfo) postLayoutInfo));
     99         return super.animateAppearance(viewHolder, preLayoutInfo, postLayoutInfo);
    100     }
    101 
    102     @Override
    103     public boolean animatePersistence(@NonNull RecyclerView.ViewHolder viewHolder,
    104             @NonNull ItemHolderInfo preInfo,
    105             @NonNull ItemHolderInfo postInfo) {
    106         mAnimatePersistenceList
    107                 .add(new AnimatePersistence(viewHolder,
    108                         (BaseRecyclerViewAnimationsTest.LoggingInfo) preInfo,
    109                         (BaseRecyclerViewAnimationsTest.LoggingInfo) postInfo));
    110         return super.animatePersistence(viewHolder, preInfo, postInfo);
    111     }
    112 
    113     @Override
    114     public boolean animateChange(@NonNull RecyclerView.ViewHolder oldHolder,
    115             @NonNull RecyclerView.ViewHolder newHolder, @NonNull ItemHolderInfo preInfo,
    116             @NonNull ItemHolderInfo postInfo) {
    117         mAnimateChangeList
    118                 .add(new AnimateChange(oldHolder, newHolder,
    119                         (BaseRecyclerViewAnimationsTest.LoggingInfo) preInfo,
    120                         (BaseRecyclerViewAnimationsTest.LoggingInfo) postInfo));
    121         return super.animateChange(oldHolder, newHolder, preInfo, postInfo);
    122     }
    123 
    124     @Override
    125     public void runPendingAnimations() {
    126         if (mWaitForPendingAnimations != null) {
    127             mWaitForPendingAnimations.countDown();
    128         }
    129         super.runPendingAnimations();
    130     }
    131 
    132     public void expectRunPendingAnimationsCall(int count) {
    133         mWaitForPendingAnimations = new CountDownLatch(count);
    134     }
    135 
    136     public void waitForPendingAnimationsCall(int seconds) throws InterruptedException {
    137         mWaitForPendingAnimations.await(seconds, TimeUnit.SECONDS);
    138     }
    139 
    140     @Override
    141     public boolean animateAdd(RecyclerView.ViewHolder holder) {
    142         mAddVHs.add(holder);
    143         return super.animateAdd(holder);
    144     }
    145 
    146     @Override
    147     public boolean animateRemove(RecyclerView.ViewHolder holder) {
    148         mRemoveVHs.add(holder);
    149         return super.animateRemove(holder);
    150     }
    151 
    152     @Override
    153     public boolean animateMove(RecyclerView.ViewHolder holder, int fromX, int fromY,
    154             int toX, int toY) {
    155         mMoveVHs.add(holder);
    156         return super.animateMove(holder, fromX, fromY, toX, toY);
    157     }
    158 
    159     @Override
    160     public boolean animateChange(RecyclerView.ViewHolder oldHolder,
    161             RecyclerView.ViewHolder newHolder, int fromX, int fromY, int toX, int toY) {
    162         if (oldHolder != null) {
    163             mChangeOldVHs.add(oldHolder);
    164         }
    165         if (newHolder != null) {
    166             mChangeNewVHs.add(newHolder);
    167         }
    168         return super.animateChange(oldHolder, newHolder, fromX, fromY, toX, toY);
    169     }
    170 
    171     public void reset() {
    172         mAddVHs.clear();
    173         mRemoveVHs.clear();
    174         mMoveVHs.clear();
    175         mChangeOldVHs.clear();
    176         mChangeNewVHs.clear();
    177         mAnimateChangeList.clear();
    178         mAnimatePersistenceList.clear();
    179         mAnimateAppearanceList.clear();
    180         mAnimateDisappearanceList.clear();
    181     }
    182 }