Rabbit-R1/original r1/java/sources/androidx/recyclerview/widget/ChildHelper.java

414 lines
13 KiB
Java
Raw Normal View History

2024-05-21 16:08:36 -05:00
package androidx.recyclerview.widget;
import android.view.View;
import android.view.ViewGroup;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
/* JADX INFO: Access modifiers changed from: package-private */
/* loaded from: classes2.dex */
public class ChildHelper {
private static final boolean DEBUG = false;
private static final int REMOVE_STATUS_IN_REMOVE = 1;
private static final int REMOVE_STATUS_IN_REMOVE_IF_HIDDEN = 2;
private static final int REMOVE_STATUS_NONE = 0;
private static final String TAG = "ChildrenHelper";
final Callback mCallback;
private View mViewInRemoveView;
private int mRemoveStatus = 0;
final Bucket mBucket = new Bucket();
final List<View> mHiddenViews = new ArrayList();
/* JADX INFO: Access modifiers changed from: package-private */
/* loaded from: classes2.dex */
public interface Callback {
void addView(View view, int i);
void attachViewToParent(View view, int i, ViewGroup.LayoutParams layoutParams);
void detachViewFromParent(int i);
View getChildAt(int i);
int getChildCount();
RecyclerView.ViewHolder getChildViewHolder(View view);
int indexOfChild(View view);
void onEnteredHiddenState(View view);
void onLeftHiddenState(View view);
void removeAllViews();
void removeViewAt(int i);
}
/* JADX INFO: Access modifiers changed from: package-private */
public ChildHelper(Callback callback) {
this.mCallback = callback;
}
private void hideViewInternal(View view) {
this.mHiddenViews.add(view);
this.mCallback.onEnteredHiddenState(view);
}
private boolean unhideViewInternal(View view) {
if (!this.mHiddenViews.remove(view)) {
return false;
}
this.mCallback.onLeftHiddenState(view);
return true;
}
/* JADX INFO: Access modifiers changed from: package-private */
public void addView(View view, boolean z) {
addView(view, -1, z);
}
/* JADX INFO: Access modifiers changed from: package-private */
public void addView(View view, int i, boolean z) {
int offset;
if (i < 0) {
offset = this.mCallback.getChildCount();
} else {
offset = getOffset(i);
}
this.mBucket.insert(offset, z);
if (z) {
hideViewInternal(view);
}
this.mCallback.addView(view, offset);
}
private int getOffset(int i) {
if (i < 0) {
return -1;
}
int childCount = this.mCallback.getChildCount();
int i2 = i;
while (i2 < childCount) {
int countOnesBefore = i - (i2 - this.mBucket.countOnesBefore(i2));
if (countOnesBefore == 0) {
while (this.mBucket.get(i2)) {
i2++;
}
return i2;
}
i2 += countOnesBefore;
}
return -1;
}
/* JADX INFO: Access modifiers changed from: package-private */
public void removeView(View view) {
int i = this.mRemoveStatus;
if (i == 1) {
throw new IllegalStateException("Cannot call removeView(At) within removeView(At)");
}
if (i == 2) {
throw new IllegalStateException("Cannot call removeView(At) within removeViewIfHidden");
}
try {
this.mRemoveStatus = 1;
this.mViewInRemoveView = view;
int indexOfChild = this.mCallback.indexOfChild(view);
if (indexOfChild < 0) {
return;
}
if (this.mBucket.remove(indexOfChild)) {
unhideViewInternal(view);
}
this.mCallback.removeViewAt(indexOfChild);
} finally {
this.mRemoveStatus = 0;
this.mViewInRemoveView = null;
}
}
/* JADX INFO: Access modifiers changed from: package-private */
public void removeViewAt(int i) {
int i2 = this.mRemoveStatus;
if (i2 == 1) {
throw new IllegalStateException("Cannot call removeView(At) within removeView(At)");
}
if (i2 == 2) {
throw new IllegalStateException("Cannot call removeView(At) within removeViewIfHidden");
}
try {
int offset = getOffset(i);
View childAt = this.mCallback.getChildAt(offset);
if (childAt == null) {
return;
}
this.mRemoveStatus = 1;
this.mViewInRemoveView = childAt;
if (this.mBucket.remove(offset)) {
unhideViewInternal(childAt);
}
this.mCallback.removeViewAt(offset);
} finally {
this.mRemoveStatus = 0;
this.mViewInRemoveView = null;
}
}
/* JADX INFO: Access modifiers changed from: package-private */
public View getChildAt(int i) {
return this.mCallback.getChildAt(getOffset(i));
}
/* JADX INFO: Access modifiers changed from: package-private */
public void removeAllViewsUnfiltered() {
this.mBucket.reset();
for (int size = this.mHiddenViews.size() - 1; size >= 0; size--) {
this.mCallback.onLeftHiddenState(this.mHiddenViews.get(size));
this.mHiddenViews.remove(size);
}
this.mCallback.removeAllViews();
}
/* JADX INFO: Access modifiers changed from: package-private */
public View findHiddenNonRemovedView(int i) {
int size = this.mHiddenViews.size();
for (int i2 = 0; i2 < size; i2++) {
View view = this.mHiddenViews.get(i2);
RecyclerView.ViewHolder childViewHolder = this.mCallback.getChildViewHolder(view);
if (childViewHolder.getLayoutPosition() == i && !childViewHolder.isInvalid() && !childViewHolder.isRemoved()) {
return view;
}
}
return null;
}
/* JADX INFO: Access modifiers changed from: package-private */
public void attachViewToParent(View view, int i, ViewGroup.LayoutParams layoutParams, boolean z) {
int offset;
if (i < 0) {
offset = this.mCallback.getChildCount();
} else {
offset = getOffset(i);
}
this.mBucket.insert(offset, z);
if (z) {
hideViewInternal(view);
}
this.mCallback.attachViewToParent(view, offset, layoutParams);
}
/* JADX INFO: Access modifiers changed from: package-private */
public int getChildCount() {
return this.mCallback.getChildCount() - this.mHiddenViews.size();
}
/* JADX INFO: Access modifiers changed from: package-private */
public int getUnfilteredChildCount() {
return this.mCallback.getChildCount();
}
/* JADX INFO: Access modifiers changed from: package-private */
public View getUnfilteredChildAt(int i) {
return this.mCallback.getChildAt(i);
}
/* JADX INFO: Access modifiers changed from: package-private */
public void detachViewFromParent(int i) {
int offset = getOffset(i);
this.mBucket.remove(offset);
this.mCallback.detachViewFromParent(offset);
}
/* JADX INFO: Access modifiers changed from: package-private */
public int indexOfChild(View view) {
int indexOfChild = this.mCallback.indexOfChild(view);
if (indexOfChild == -1 || this.mBucket.get(indexOfChild)) {
return -1;
}
return indexOfChild - this.mBucket.countOnesBefore(indexOfChild);
}
/* JADX INFO: Access modifiers changed from: package-private */
public boolean isHidden(View view) {
return this.mHiddenViews.contains(view);
}
/* JADX INFO: Access modifiers changed from: package-private */
public void hide(View view) {
int indexOfChild = this.mCallback.indexOfChild(view);
if (indexOfChild < 0) {
throw new IllegalArgumentException("view is not a child, cannot hide " + view);
}
this.mBucket.set(indexOfChild);
hideViewInternal(view);
}
/* JADX INFO: Access modifiers changed from: package-private */
public void unhide(View view) {
int indexOfChild = this.mCallback.indexOfChild(view);
if (indexOfChild < 0) {
throw new IllegalArgumentException("view is not a child, cannot hide " + view);
}
if (!this.mBucket.get(indexOfChild)) {
throw new RuntimeException("trying to unhide a view that was not hidden" + view);
}
this.mBucket.clear(indexOfChild);
unhideViewInternal(view);
}
public String toString() {
return this.mBucket.toString() + ", hidden list:" + this.mHiddenViews.size();
}
/* JADX INFO: Access modifiers changed from: package-private */
public boolean removeViewIfHidden(View view) {
int i = this.mRemoveStatus;
if (i == 1) {
if (this.mViewInRemoveView == view) {
return false;
}
throw new IllegalStateException("Cannot call removeViewIfHidden within removeView(At) for a different view");
}
if (i == 2) {
throw new IllegalStateException("Cannot call removeViewIfHidden within removeViewIfHidden");
}
try {
this.mRemoveStatus = 2;
int indexOfChild = this.mCallback.indexOfChild(view);
if (indexOfChild == -1) {
unhideViewInternal(view);
return true;
}
if (!this.mBucket.get(indexOfChild)) {
return false;
}
this.mBucket.remove(indexOfChild);
unhideViewInternal(view);
this.mCallback.removeViewAt(indexOfChild);
return true;
} finally {
this.mRemoveStatus = 0;
}
}
/* JADX INFO: Access modifiers changed from: package-private */
/* loaded from: classes2.dex */
public static class Bucket {
static final int BITS_PER_WORD = 64;
static final long LAST_BIT = Long.MIN_VALUE;
long mData = 0;
Bucket mNext;
Bucket() {
}
void set(int i) {
if (i < 64) {
this.mData |= 1 << i;
} else {
ensureNext();
this.mNext.set(i - 64);
}
}
private void ensureNext() {
if (this.mNext == null) {
this.mNext = new Bucket();
}
}
void clear(int i) {
if (i < 64) {
this.mData &= ~(1 << i);
return;
}
Bucket bucket = this.mNext;
if (bucket != null) {
bucket.clear(i - 64);
}
}
boolean get(int i) {
if (i < 64) {
return ((1 << i) & this.mData) != 0;
}
ensureNext();
return this.mNext.get(i - 64);
}
void reset() {
this.mData = 0L;
Bucket bucket = this.mNext;
if (bucket != null) {
bucket.reset();
}
}
void insert(int i, boolean z) {
if (i >= 64) {
ensureNext();
this.mNext.insert(i - 64, z);
return;
}
long j = this.mData;
boolean z2 = (Long.MIN_VALUE & j) != 0;
long j2 = (1 << i) - 1;
this.mData = ((j & (~j2)) << 1) | (j & j2);
if (z) {
set(i);
} else {
clear(i);
}
if (z2 || this.mNext != null) {
ensureNext();
this.mNext.insert(0, z2);
}
}
boolean remove(int i) {
if (i >= 64) {
ensureNext();
return this.mNext.remove(i - 64);
}
long j = 1 << i;
long j2 = this.mData;
boolean z = (j2 & j) != 0;
long j3 = j2 & (~j);
this.mData = j3;
long j4 = j - 1;
this.mData = (j3 & j4) | Long.rotateRight((~j4) & j3, 1);
Bucket bucket = this.mNext;
if (bucket != null) {
if (bucket.get(0)) {
set(63);
}
this.mNext.remove(0);
}
return z;
}
int countOnesBefore(int i) {
Bucket bucket = this.mNext;
if (bucket == null) {
if (i >= 64) {
return Long.bitCount(this.mData);
}
return Long.bitCount(((1 << i) - 1) & this.mData);
}
if (i < 64) {
return Long.bitCount(((1 << i) - 1) & this.mData);
}
return bucket.countOnesBefore(i - 64) + Long.bitCount(this.mData);
}
public String toString() {
if (this.mNext == null) {
return Long.toBinaryString(this.mData);
}
return this.mNext.toString() + "xx" + Long.toBinaryString(this.mData);
}
}
}