ADD week 5
This commit is contained in:
		| @@ -0,0 +1,213 @@ | ||||
| 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) { | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user