mirror of
https://github.com/Pinball3D/Rabbit-R1.git
synced 2024-12-30 11:02:31 -06:00
414 lines
13 KiB
Java
414 lines
13 KiB
Java
|
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);
|
||
|
}
|
||
|
}
|
||
|
}
|