discord-jadx/app/src/main/java/androidx/recyclerview/widget/GapWorker.java

300 lines
12 KiB
Java

package androidx.recyclerview.widget;
import android.annotation.SuppressLint;
import androidx.annotation.Nullable;
import androidx.core.os.TraceCompat;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.concurrent.TimeUnit;
public final class GapWorker implements Runnable {
public static final ThreadLocal<GapWorker> sGapWorker = new ThreadLocal<>();
public static Comparator<Task> sTaskComparator = new AnonymousClass1();
public long mFrameIntervalNs;
public long mPostTimeNs;
public ArrayList<RecyclerView> mRecyclerViews = new ArrayList<>();
private ArrayList<Task> mTasks = new ArrayList<>();
/* renamed from: androidx.recyclerview.widget.GapWorker$1 reason: invalid class name */
public static class AnonymousClass1 implements Comparator<Task> {
public int compare(Task task, Task task2) {
RecyclerView recyclerView = task.view;
if ((recyclerView == null) != (task2.view == null)) {
return recyclerView == null ? 1 : -1;
}
boolean z2 = task.immediate;
if (z2 != task2.immediate) {
return z2 ? -1 : 1;
}
int i = task2.viewVelocity - task.viewVelocity;
if (i != 0) {
return i;
}
int i2 = task.distanceToItem - task2.distanceToItem;
if (i2 != 0) {
return i2;
}
return 0;
}
}
@SuppressLint({"VisibleForTests"})
public static class LayoutPrefetchRegistryImpl implements RecyclerView.LayoutManager.LayoutPrefetchRegistry {
public int mCount;
public int[] mPrefetchArray;
public int mPrefetchDx;
public int mPrefetchDy;
@Override // androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry
public void addPosition(int i, int i2) {
if (i < 0) {
throw new IllegalArgumentException("Layout positions must be non-negative");
} else if (i2 >= 0) {
int i3 = this.mCount * 2;
int[] iArr = this.mPrefetchArray;
if (iArr == null) {
int[] iArr2 = new int[4];
this.mPrefetchArray = iArr2;
Arrays.fill(iArr2, -1);
} else if (i3 >= iArr.length) {
int[] iArr3 = new int[(i3 * 2)];
this.mPrefetchArray = iArr3;
System.arraycopy(iArr, 0, iArr3, 0, iArr.length);
}
int[] iArr4 = this.mPrefetchArray;
iArr4[i3] = i;
iArr4[i3 + 1] = i2;
this.mCount++;
} else {
throw new IllegalArgumentException("Pixel distance must be non-negative");
}
}
public void clearPrefetchPositions() {
int[] iArr = this.mPrefetchArray;
if (iArr != null) {
Arrays.fill(iArr, -1);
}
this.mCount = 0;
}
public void collectPrefetchPositionsFromView(RecyclerView recyclerView, boolean z2) {
this.mCount = 0;
int[] iArr = this.mPrefetchArray;
if (iArr != null) {
Arrays.fill(iArr, -1);
}
RecyclerView.LayoutManager layoutManager = recyclerView.mLayout;
if (recyclerView.mAdapter != null && layoutManager != null && layoutManager.isItemPrefetchEnabled()) {
if (z2) {
if (!recyclerView.mAdapterHelper.hasPendingUpdates()) {
layoutManager.collectInitialPrefetchPositions(recyclerView.mAdapter.getItemCount(), this);
}
} else if (!recyclerView.hasPendingAdapterUpdates()) {
layoutManager.collectAdjacentPrefetchPositions(this.mPrefetchDx, this.mPrefetchDy, recyclerView.mState, this);
}
int i = this.mCount;
if (i > layoutManager.mPrefetchMaxCountObserved) {
layoutManager.mPrefetchMaxCountObserved = i;
layoutManager.mPrefetchMaxObservedInInitialPrefetch = z2;
recyclerView.mRecycler.updateViewCacheSize();
}
}
}
public boolean lastPrefetchIncludedPosition(int i) {
if (this.mPrefetchArray != null) {
int i2 = this.mCount * 2;
for (int i3 = 0; i3 < i2; i3 += 2) {
if (this.mPrefetchArray[i3] == i) {
return true;
}
}
}
return false;
}
public void setPrefetchVector(int i, int i2) {
this.mPrefetchDx = i;
this.mPrefetchDy = i2;
}
}
public static class Task {
public int distanceToItem;
public boolean immediate;
public int position;
public RecyclerView view;
public int viewVelocity;
public void clear() {
this.immediate = false;
this.viewVelocity = 0;
this.distanceToItem = 0;
this.view = null;
this.position = 0;
}
}
private void buildTaskList() {
Task task;
int size = this.mRecyclerViews.size();
int i = 0;
for (int i2 = 0; i2 < size; i2++) {
RecyclerView recyclerView = this.mRecyclerViews.get(i2);
if (recyclerView.getWindowVisibility() == 0) {
recyclerView.mPrefetchRegistry.collectPrefetchPositionsFromView(recyclerView, false);
i += recyclerView.mPrefetchRegistry.mCount;
}
}
this.mTasks.ensureCapacity(i);
int i3 = 0;
for (int i4 = 0; i4 < size; i4++) {
RecyclerView recyclerView2 = this.mRecyclerViews.get(i4);
if (recyclerView2.getWindowVisibility() == 0) {
LayoutPrefetchRegistryImpl layoutPrefetchRegistryImpl = recyclerView2.mPrefetchRegistry;
int abs = Math.abs(layoutPrefetchRegistryImpl.mPrefetchDy) + Math.abs(layoutPrefetchRegistryImpl.mPrefetchDx);
for (int i5 = 0; i5 < layoutPrefetchRegistryImpl.mCount * 2; i5 += 2) {
if (i3 >= this.mTasks.size()) {
task = new Task();
this.mTasks.add(task);
} else {
task = this.mTasks.get(i3);
}
int[] iArr = layoutPrefetchRegistryImpl.mPrefetchArray;
int i6 = iArr[i5 + 1];
task.immediate = i6 <= abs;
task.viewVelocity = abs;
task.distanceToItem = i6;
task.view = recyclerView2;
task.position = iArr[i5];
i3++;
}
}
}
Collections.sort(this.mTasks, sTaskComparator);
}
private void flushTaskWithDeadline(Task task, long j) {
RecyclerView.ViewHolder prefetchPositionWithDeadline = prefetchPositionWithDeadline(task.view, task.position, task.immediate ? Long.MAX_VALUE : j);
if (prefetchPositionWithDeadline != null && prefetchPositionWithDeadline.mNestedRecyclerView != null && prefetchPositionWithDeadline.isBound() && !prefetchPositionWithDeadline.isInvalid()) {
prefetchInnerRecyclerViewWithDeadline(prefetchPositionWithDeadline.mNestedRecyclerView.get(), j);
}
}
private void flushTasksWithDeadline(long j) {
for (int i = 0; i < this.mTasks.size(); i++) {
Task task = this.mTasks.get(i);
if (task.view != null) {
flushTaskWithDeadline(task, j);
task.clear();
} else {
return;
}
}
}
public static boolean isPrefetchPositionAttached(RecyclerView recyclerView, int i) {
int unfilteredChildCount = recyclerView.mChildHelper.getUnfilteredChildCount();
for (int i2 = 0; i2 < unfilteredChildCount; i2++) {
RecyclerView.ViewHolder childViewHolderInt = RecyclerView.getChildViewHolderInt(recyclerView.mChildHelper.getUnfilteredChildAt(i2));
if (childViewHolderInt.mPosition == i && !childViewHolderInt.isInvalid()) {
return true;
}
}
return false;
}
private void prefetchInnerRecyclerViewWithDeadline(@Nullable RecyclerView recyclerView, long j) {
if (recyclerView != null) {
if (recyclerView.mDataSetHasChangedAfterLayout && recyclerView.mChildHelper.getUnfilteredChildCount() != 0) {
recyclerView.removeAndRecycleViews();
}
LayoutPrefetchRegistryImpl layoutPrefetchRegistryImpl = recyclerView.mPrefetchRegistry;
layoutPrefetchRegistryImpl.collectPrefetchPositionsFromView(recyclerView, true);
if (layoutPrefetchRegistryImpl.mCount != 0) {
try {
TraceCompat.beginSection("RV Nested Prefetch");
recyclerView.mState.prepareForNestedPrefetch(recyclerView.mAdapter);
for (int i = 0; i < layoutPrefetchRegistryImpl.mCount * 2; i += 2) {
prefetchPositionWithDeadline(recyclerView, layoutPrefetchRegistryImpl.mPrefetchArray[i], j);
}
} finally {
TraceCompat.endSection();
}
}
}
}
private RecyclerView.ViewHolder prefetchPositionWithDeadline(RecyclerView recyclerView, int i, long j) {
if (isPrefetchPositionAttached(recyclerView, i)) {
return null;
}
RecyclerView.Recycler recycler = recyclerView.mRecycler;
boolean z2 = false;
try {
recyclerView.onEnterLayoutOrScroll();
RecyclerView.ViewHolder tryGetViewHolderForPositionByDeadline = recycler.tryGetViewHolderForPositionByDeadline(i, false, j);
if (tryGetViewHolderForPositionByDeadline != null) {
if (!tryGetViewHolderForPositionByDeadline.isBound() || tryGetViewHolderForPositionByDeadline.isInvalid()) {
recycler.addViewHolderToRecycledViewPool(tryGetViewHolderForPositionByDeadline, false);
} else {
recycler.recycleView(tryGetViewHolderForPositionByDeadline.itemView);
}
}
return tryGetViewHolderForPositionByDeadline;
} finally {
recyclerView.onExitLayoutOrScroll(z2);
}
}
public void add(RecyclerView recyclerView) {
this.mRecyclerViews.add(recyclerView);
}
public void postFromTraversal(RecyclerView recyclerView, int i, int i2) {
if (recyclerView.isAttachedToWindow() && this.mPostTimeNs == 0) {
this.mPostTimeNs = recyclerView.getNanoTime();
recyclerView.post(this);
}
recyclerView.mPrefetchRegistry.setPrefetchVector(i, i2);
}
public void prefetch(long j) {
buildTaskList();
flushTasksWithDeadline(j);
}
public void remove(RecyclerView recyclerView) {
this.mRecyclerViews.remove(recyclerView);
}
@Override // java.lang.Runnable
public void run() {
long j = 0;
try {
TraceCompat.beginSection("RV Prefetch");
if (!this.mRecyclerViews.isEmpty()) {
int size = this.mRecyclerViews.size();
long j2 = 0;
for (int i = 0; i < size; i++) {
RecyclerView recyclerView = this.mRecyclerViews.get(i);
if (recyclerView.getWindowVisibility() == 0) {
j2 = Math.max(recyclerView.getDrawingTime(), j2);
}
}
if (j2 != 0) {
prefetch(TimeUnit.MILLISECONDS.toNanos(j2) + this.mFrameIntervalNs);
this.mPostTimeNs = 0;
TraceCompat.endSection();
}
}
} finally {
this.mPostTimeNs = j;
TraceCompat.endSection();
}
}
}