214 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			214 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package androidx.recyclerview.widget;
 | |
| 
 | |
| import androidx.collection.LongSparseArray;
 | |
| import androidx.collection.SimpleArrayMap;
 | |
| import androidx.core.util.Pools;
 | |
| import androidx.recyclerview.widget.RecyclerView;
 | |
| 
 | |
| /* loaded from: classes.dex */
 | |
| class ViewInfoStore {
 | |
|     private static final boolean DEBUG = false;
 | |
|     final SimpleArrayMap<RecyclerView.ViewHolder, InfoRecord> mLayoutHolderMap = new SimpleArrayMap<>();
 | |
|     final LongSparseArray<RecyclerView.ViewHolder> mOldChangedHolders = new LongSparseArray<>();
 | |
| 
 | |
|     interface ProcessCallback {
 | |
|         void processAppeared(RecyclerView.ViewHolder viewHolder, RecyclerView.ItemAnimator.ItemHolderInfo itemHolderInfo, RecyclerView.ItemAnimator.ItemHolderInfo itemHolderInfo2);
 | |
| 
 | |
|         void processDisappeared(RecyclerView.ViewHolder viewHolder, RecyclerView.ItemAnimator.ItemHolderInfo itemHolderInfo, RecyclerView.ItemAnimator.ItemHolderInfo itemHolderInfo2);
 | |
| 
 | |
|         void processPersistent(RecyclerView.ViewHolder viewHolder, RecyclerView.ItemAnimator.ItemHolderInfo itemHolderInfo, RecyclerView.ItemAnimator.ItemHolderInfo itemHolderInfo2);
 | |
| 
 | |
|         void unused(RecyclerView.ViewHolder viewHolder);
 | |
|     }
 | |
| 
 | |
|     ViewInfoStore() {
 | |
|     }
 | |
| 
 | |
|     void clear() {
 | |
|         this.mLayoutHolderMap.clear();
 | |
|         this.mOldChangedHolders.clear();
 | |
|     }
 | |
| 
 | |
|     void addToPreLayout(RecyclerView.ViewHolder viewHolder, RecyclerView.ItemAnimator.ItemHolderInfo itemHolderInfo) {
 | |
|         InfoRecord infoRecord = this.mLayoutHolderMap.get(viewHolder);
 | |
|         if (infoRecord == null) {
 | |
|             infoRecord = InfoRecord.obtain();
 | |
|             this.mLayoutHolderMap.put(viewHolder, infoRecord);
 | |
|         }
 | |
|         infoRecord.preInfo = itemHolderInfo;
 | |
|         infoRecord.flags |= 4;
 | |
|     }
 | |
| 
 | |
|     boolean isDisappearing(RecyclerView.ViewHolder viewHolder) {
 | |
|         InfoRecord infoRecord = this.mLayoutHolderMap.get(viewHolder);
 | |
|         return (infoRecord == null || (infoRecord.flags & 1) == 0) ? false : true;
 | |
|     }
 | |
| 
 | |
|     RecyclerView.ItemAnimator.ItemHolderInfo popFromPreLayout(RecyclerView.ViewHolder viewHolder) {
 | |
|         return popFromLayoutStep(viewHolder, 4);
 | |
|     }
 | |
| 
 | |
|     RecyclerView.ItemAnimator.ItemHolderInfo popFromPostLayout(RecyclerView.ViewHolder viewHolder) {
 | |
|         return popFromLayoutStep(viewHolder, 8);
 | |
|     }
 | |
| 
 | |
|     private RecyclerView.ItemAnimator.ItemHolderInfo popFromLayoutStep(RecyclerView.ViewHolder viewHolder, int i) {
 | |
|         InfoRecord valueAt;
 | |
|         RecyclerView.ItemAnimator.ItemHolderInfo itemHolderInfo;
 | |
|         int indexOfKey = this.mLayoutHolderMap.indexOfKey(viewHolder);
 | |
|         if (indexOfKey < 0 || (valueAt = this.mLayoutHolderMap.valueAt(indexOfKey)) == null || (valueAt.flags & i) == 0) {
 | |
|             return null;
 | |
|         }
 | |
|         valueAt.flags &= ~i;
 | |
|         if (i == 4) {
 | |
|             itemHolderInfo = valueAt.preInfo;
 | |
|         } else if (i == 8) {
 | |
|             itemHolderInfo = valueAt.postInfo;
 | |
|         } else {
 | |
|             throw new IllegalArgumentException("Must provide flag PRE or POST");
 | |
|         }
 | |
|         if ((valueAt.flags & 12) == 0) {
 | |
|             this.mLayoutHolderMap.removeAt(indexOfKey);
 | |
|             InfoRecord.recycle(valueAt);
 | |
|         }
 | |
|         return itemHolderInfo;
 | |
|     }
 | |
| 
 | |
|     void addToOldChangeHolders(long j, RecyclerView.ViewHolder viewHolder) {
 | |
|         this.mOldChangedHolders.put(j, viewHolder);
 | |
|     }
 | |
| 
 | |
|     void addToAppearedInPreLayoutHolders(RecyclerView.ViewHolder viewHolder, RecyclerView.ItemAnimator.ItemHolderInfo itemHolderInfo) {
 | |
|         InfoRecord infoRecord = this.mLayoutHolderMap.get(viewHolder);
 | |
|         if (infoRecord == null) {
 | |
|             infoRecord = InfoRecord.obtain();
 | |
|             this.mLayoutHolderMap.put(viewHolder, infoRecord);
 | |
|         }
 | |
|         infoRecord.flags |= 2;
 | |
|         infoRecord.preInfo = itemHolderInfo;
 | |
|     }
 | |
| 
 | |
|     boolean isInPreLayout(RecyclerView.ViewHolder viewHolder) {
 | |
|         InfoRecord infoRecord = this.mLayoutHolderMap.get(viewHolder);
 | |
|         return (infoRecord == null || (infoRecord.flags & 4) == 0) ? false : true;
 | |
|     }
 | |
| 
 | |
|     RecyclerView.ViewHolder getFromOldChangeHolders(long j) {
 | |
|         return this.mOldChangedHolders.get(j);
 | |
|     }
 | |
| 
 | |
|     void addToPostLayout(RecyclerView.ViewHolder viewHolder, RecyclerView.ItemAnimator.ItemHolderInfo itemHolderInfo) {
 | |
|         InfoRecord infoRecord = this.mLayoutHolderMap.get(viewHolder);
 | |
|         if (infoRecord == null) {
 | |
|             infoRecord = InfoRecord.obtain();
 | |
|             this.mLayoutHolderMap.put(viewHolder, infoRecord);
 | |
|         }
 | |
|         infoRecord.postInfo = itemHolderInfo;
 | |
|         infoRecord.flags |= 8;
 | |
|     }
 | |
| 
 | |
|     void addToDisappearedInLayout(RecyclerView.ViewHolder viewHolder) {
 | |
|         InfoRecord infoRecord = this.mLayoutHolderMap.get(viewHolder);
 | |
|         if (infoRecord == null) {
 | |
|             infoRecord = InfoRecord.obtain();
 | |
|             this.mLayoutHolderMap.put(viewHolder, infoRecord);
 | |
|         }
 | |
|         infoRecord.flags |= 1;
 | |
|     }
 | |
| 
 | |
|     void removeFromDisappearedInLayout(RecyclerView.ViewHolder viewHolder) {
 | |
|         InfoRecord infoRecord = this.mLayoutHolderMap.get(viewHolder);
 | |
|         if (infoRecord == null) {
 | |
|             return;
 | |
|         }
 | |
|         infoRecord.flags &= -2;
 | |
|     }
 | |
| 
 | |
|     void process(ProcessCallback processCallback) {
 | |
|         for (int size = this.mLayoutHolderMap.size() - 1; size >= 0; size--) {
 | |
|             RecyclerView.ViewHolder keyAt = this.mLayoutHolderMap.keyAt(size);
 | |
|             InfoRecord removeAt = this.mLayoutHolderMap.removeAt(size);
 | |
|             if ((removeAt.flags & 3) == 3) {
 | |
|                 processCallback.unused(keyAt);
 | |
|             } else if ((removeAt.flags & 1) != 0) {
 | |
|                 if (removeAt.preInfo == null) {
 | |
|                     processCallback.unused(keyAt);
 | |
|                 } else {
 | |
|                     processCallback.processDisappeared(keyAt, removeAt.preInfo, removeAt.postInfo);
 | |
|                 }
 | |
|             } else if ((removeAt.flags & 14) == 14) {
 | |
|                 processCallback.processAppeared(keyAt, removeAt.preInfo, removeAt.postInfo);
 | |
|             } else if ((removeAt.flags & 12) == 12) {
 | |
|                 processCallback.processPersistent(keyAt, removeAt.preInfo, removeAt.postInfo);
 | |
|             } else if ((removeAt.flags & 4) != 0) {
 | |
|                 processCallback.processDisappeared(keyAt, removeAt.preInfo, null);
 | |
|             } else if ((removeAt.flags & 8) != 0) {
 | |
|                 processCallback.processAppeared(keyAt, removeAt.preInfo, removeAt.postInfo);
 | |
|             } else {
 | |
|                 int i = removeAt.flags;
 | |
|             }
 | |
|             InfoRecord.recycle(removeAt);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     void removeViewHolder(RecyclerView.ViewHolder viewHolder) {
 | |
|         int size = this.mOldChangedHolders.size() - 1;
 | |
|         while (true) {
 | |
|             if (size < 0) {
 | |
|                 break;
 | |
|             }
 | |
|             if (viewHolder == this.mOldChangedHolders.valueAt(size)) {
 | |
|                 this.mOldChangedHolders.removeAt(size);
 | |
|                 break;
 | |
|             }
 | |
|             size--;
 | |
|         }
 | |
|         InfoRecord remove = this.mLayoutHolderMap.remove(viewHolder);
 | |
|         if (remove != null) {
 | |
|             InfoRecord.recycle(remove);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     void onDetach() {
 | |
|         InfoRecord.drainCache();
 | |
|     }
 | |
| 
 | |
|     public void onViewDetached(RecyclerView.ViewHolder viewHolder) {
 | |
|         removeFromDisappearedInLayout(viewHolder);
 | |
|     }
 | |
| 
 | |
|     static class InfoRecord {
 | |
|         static final int FLAG_APPEAR = 2;
 | |
|         static final int FLAG_APPEAR_AND_DISAPPEAR = 3;
 | |
|         static final int FLAG_APPEAR_PRE_AND_POST = 14;
 | |
|         static final int FLAG_DISAPPEARED = 1;
 | |
|         static final int FLAG_POST = 8;
 | |
|         static final int FLAG_PRE = 4;
 | |
|         static final int FLAG_PRE_AND_POST = 12;
 | |
|         static Pools.Pool<InfoRecord> sPool = new Pools.SimplePool(20);
 | |
|         int flags;
 | |
|         RecyclerView.ItemAnimator.ItemHolderInfo postInfo;
 | |
|         RecyclerView.ItemAnimator.ItemHolderInfo preInfo;
 | |
| 
 | |
|         private InfoRecord() {
 | |
|         }
 | |
| 
 | |
|         static InfoRecord obtain() {
 | |
|             InfoRecord acquire = sPool.acquire();
 | |
|             return acquire == null ? new InfoRecord() : acquire;
 | |
|         }
 | |
| 
 | |
|         static void recycle(InfoRecord infoRecord) {
 | |
|             infoRecord.flags = 0;
 | |
|             infoRecord.preInfo = null;
 | |
|             infoRecord.postInfo = null;
 | |
|             sPool.release(infoRecord);
 | |
|         }
 | |
| 
 | |
|         static void drainCache() {
 | |
|             while (sPool.acquire() != null) {
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |