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 
contains(RecyclerView.ViewHolder viewHolder, List<? extends BaseRecyclerViewAnimationsTest.AnimateLogBase> list)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
recordPreLayoutInformation(@onNull RecyclerView.State state, @NonNull RecyclerView.ViewHolder viewHolder, @AdapterChanges int changeFlags, @NonNull List<Object> payloads)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
recordPostLayoutInformation(@onNull RecyclerView.State state, @NonNull RecyclerView.ViewHolder viewHolder)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
animateDisappearance(@onNull RecyclerView.ViewHolder viewHolder, @NonNull ItemHolderInfo preLayoutInfo, ItemHolderInfo postLayoutInfo)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
animateAppearance(@onNull RecyclerView.ViewHolder viewHolder, ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo)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
animatePersistence(@onNull RecyclerView.ViewHolder viewHolder, @NonNull ItemHolderInfo preInfo, @NonNull ItemHolderInfo postInfo)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
animateChange(@onNull RecyclerView.ViewHolder oldHolder, @NonNull RecyclerView.ViewHolder newHolder, @NonNull ItemHolderInfo preInfo, @NonNull ItemHolderInfo postInfo)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
runPendingAnimations()125     public void runPendingAnimations() {
126         if (mWaitForPendingAnimations != null) {
127             mWaitForPendingAnimations.countDown();
128         }
129         super.runPendingAnimations();
130     }
131 
expectRunPendingAnimationsCall(int count)132     public void expectRunPendingAnimationsCall(int count) {
133         mWaitForPendingAnimations = new CountDownLatch(count);
134     }
135 
waitForPendingAnimationsCall(int seconds)136     public void waitForPendingAnimationsCall(int seconds) throws InterruptedException {
137         mWaitForPendingAnimations.await(seconds, TimeUnit.SECONDS);
138     }
139 
140     @Override
animateAdd(RecyclerView.ViewHolder holder)141     public boolean animateAdd(RecyclerView.ViewHolder holder) {
142         mAddVHs.add(holder);
143         return super.animateAdd(holder);
144     }
145 
146     @Override
animateRemove(RecyclerView.ViewHolder holder)147     public boolean animateRemove(RecyclerView.ViewHolder holder) {
148         mRemoveVHs.add(holder);
149         return super.animateRemove(holder);
150     }
151 
152     @Override
animateMove(RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY)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
animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, int fromX, int fromY, int toX, int toY)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 
reset()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 }