package androidx.recyclerview.widget; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import c.d.b.a.a; import java.lang.reflect.Array; import java.util.Arrays; import java.util.Collection; import java.util.Comparator; public class SortedList { private static final int CAPACITY_GROWTH = 10; private static final int DELETION = 2; private static final int INSERTION = 1; public static final int INVALID_POSITION = -1; private static final int LOOKUP = 4; private static final int MIN_CAPACITY = 10; private BatchedCallback mBatchedCallback; private Callback mCallback; public T[] mData; private int mNewDataStart; private T[] mOldData; private int mOldDataSize; private int mOldDataStart; private int mSize; private final Class mTClass; public static class BatchedCallback extends Callback { private final BatchingListUpdateCallback mBatchingListUpdateCallback; public final Callback mWrappedCallback; public BatchedCallback(Callback callback) { this.mWrappedCallback = callback; this.mBatchingListUpdateCallback = new BatchingListUpdateCallback(callback); } @Override // androidx.recyclerview.widget.SortedList.Callback public boolean areContentsTheSame(T2 t2, T2 t22) { return this.mWrappedCallback.areContentsTheSame(t2, t22); } @Override // androidx.recyclerview.widget.SortedList.Callback public boolean areItemsTheSame(T2 t2, T2 t22) { return this.mWrappedCallback.areItemsTheSame(t2, t22); } @Override // androidx.recyclerview.widget.SortedList.Callback, java.util.Comparator public int compare(T2 t2, T2 t22) { return this.mWrappedCallback.compare(t2, t22); } public void dispatchLastEvent() { this.mBatchingListUpdateCallback.dispatchLastEvent(); } @Override // androidx.recyclerview.widget.SortedList.Callback @Nullable public Object getChangePayload(T2 t2, T2 t22) { return this.mWrappedCallback.getChangePayload(t2, t22); } @Override // androidx.recyclerview.widget.SortedList.Callback public void onChanged(int i, int i2) { this.mBatchingListUpdateCallback.onChanged(i, i2, null); } @Override // androidx.recyclerview.widget.SortedList.Callback, androidx.recyclerview.widget.ListUpdateCallback public void onChanged(int i, int i2, Object obj) { this.mBatchingListUpdateCallback.onChanged(i, i2, obj); } @Override // androidx.recyclerview.widget.ListUpdateCallback public void onInserted(int i, int i2) { this.mBatchingListUpdateCallback.onInserted(i, i2); } @Override // androidx.recyclerview.widget.ListUpdateCallback public void onMoved(int i, int i2) { this.mBatchingListUpdateCallback.onMoved(i, i2); } @Override // androidx.recyclerview.widget.ListUpdateCallback public void onRemoved(int i, int i2) { this.mBatchingListUpdateCallback.onRemoved(i, i2); } } public static abstract class Callback implements Comparator, ListUpdateCallback { public abstract boolean areContentsTheSame(T2 t2, T2 t22); public abstract boolean areItemsTheSame(T2 t2, T2 t22); @Override // java.util.Comparator public abstract int compare(T2 t2, T2 t22); @Nullable public Object getChangePayload(T2 t2, T2 t22) { return null; } public abstract void onChanged(int i, int i2); @Override // androidx.recyclerview.widget.ListUpdateCallback public void onChanged(int i, int i2, Object obj) { onChanged(i, i2); } } public SortedList(@NonNull Class cls, @NonNull Callback callback) { this(cls, callback, 10); } public SortedList(@NonNull Class cls, @NonNull Callback callback, int i) { this.mTClass = cls; this.mData = (T[]) ((Object[]) Array.newInstance((Class) cls, i)); this.mCallback = callback; this.mSize = 0; } private int add(T t, boolean z2) { int findIndexOf = findIndexOf(t, this.mData, 0, this.mSize, 1); if (findIndexOf == -1) { findIndexOf = 0; } else if (findIndexOf < this.mSize) { T t2 = this.mData[findIndexOf]; if (this.mCallback.areItemsTheSame(t2, t)) { if (this.mCallback.areContentsTheSame(t2, t)) { this.mData[findIndexOf] = t; return findIndexOf; } this.mData[findIndexOf] = t; Callback callback = this.mCallback; callback.onChanged(findIndexOf, 1, callback.getChangePayload(t2, t)); return findIndexOf; } } addToData(findIndexOf, t); if (z2) { this.mCallback.onInserted(findIndexOf, 1); } return findIndexOf; } private void addAllInternal(T[] tArr) { if (tArr.length >= 1) { int sortAndDedup = sortAndDedup(tArr); if (this.mSize == 0) { this.mData = tArr; this.mSize = sortAndDedup; this.mCallback.onInserted(0, sortAndDedup); return; } merge(tArr, sortAndDedup); } } private void addToData(int i, T t) { int i2 = this.mSize; if (i <= i2) { T[] tArr = this.mData; if (i2 == tArr.length) { T[] tArr2 = (T[]) ((Object[]) Array.newInstance((Class) this.mTClass, tArr.length + 10)); System.arraycopy(this.mData, 0, tArr2, 0, i); tArr2[i] = t; System.arraycopy(this.mData, i, tArr2, i + 1, this.mSize - i); this.mData = tArr2; } else { System.arraycopy(tArr, i, tArr, i + 1, i2 - i); this.mData[i] = t; } this.mSize++; return; } StringBuilder M = a.M("cannot add item to ", i, " because size is "); M.append(this.mSize); throw new IndexOutOfBoundsException(M.toString()); } private T[] copyArray(T[] tArr) { T[] tArr2 = (T[]) ((Object[]) Array.newInstance((Class) this.mTClass, tArr.length)); System.arraycopy(tArr, 0, tArr2, 0, tArr.length); return tArr2; } private int findIndexOf(T t, T[] tArr, int i, int i2, int i3) { while (i < i2) { int i4 = (i + i2) / 2; T t2 = tArr[i4]; int compare = this.mCallback.compare(t2, t); if (compare < 0) { i = i4 + 1; } else if (compare != 0) { i2 = i4; } else if (this.mCallback.areItemsTheSame(t2, t)) { return i4; } else { int linearEqualitySearch = linearEqualitySearch(t, i4, i, i2); return i3 == 1 ? linearEqualitySearch == -1 ? i4 : linearEqualitySearch : linearEqualitySearch; } } if (i3 == 1) { return i; } return -1; } private int findSameItem(T t, T[] tArr, int i, int i2) { while (i < i2) { if (this.mCallback.areItemsTheSame(tArr[i], t)) { return i; } i++; } return -1; } private int linearEqualitySearch(T t, int i, int i2, int i3) { T t2; for (int i4 = i - 1; i4 >= i2; i4--) { T t3 = this.mData[i4]; if (this.mCallback.compare(t3, t) != 0) { break; } else if (this.mCallback.areItemsTheSame(t3, t)) { return i4; } } do { i++; if (i >= i3) { return -1; } t2 = this.mData[i]; if (this.mCallback.compare(t2, t) != 0) { return -1; } } while (!this.mCallback.areItemsTheSame(t2, t)); return i; } private void merge(T[] tArr, int i) { boolean z2 = !(this.mCallback instanceof BatchedCallback); if (z2) { beginBatchedUpdates(); } this.mOldData = this.mData; int i2 = 0; this.mOldDataStart = 0; int i3 = this.mSize; this.mOldDataSize = i3; this.mData = (T[]) ((Object[]) Array.newInstance((Class) this.mTClass, i3 + i + 10)); this.mNewDataStart = 0; while (true) { int i4 = this.mOldDataStart; int i5 = this.mOldDataSize; if (i4 >= i5 && i2 >= i) { break; } else if (i4 == i5) { int i6 = i - i2; System.arraycopy(tArr, i2, this.mData, this.mNewDataStart, i6); int i7 = this.mNewDataStart + i6; this.mNewDataStart = i7; this.mSize += i6; this.mCallback.onInserted(i7 - i6, i6); break; } else if (i2 == i) { int i8 = i5 - i4; System.arraycopy(this.mOldData, i4, this.mData, this.mNewDataStart, i8); this.mNewDataStart += i8; break; } else { T t = this.mOldData[i4]; T t2 = tArr[i2]; int compare = this.mCallback.compare(t, t2); if (compare > 0) { T[] tArr2 = this.mData; int i9 = this.mNewDataStart; int i10 = i9 + 1; this.mNewDataStart = i10; tArr2[i9] = t2; this.mSize++; i2++; this.mCallback.onInserted(i10 - 1, 1); } else if (compare != 0 || !this.mCallback.areItemsTheSame(t, t2)) { T[] tArr3 = this.mData; int i11 = this.mNewDataStart; this.mNewDataStart = i11 + 1; tArr3[i11] = t; this.mOldDataStart++; } else { T[] tArr4 = this.mData; int i12 = this.mNewDataStart; this.mNewDataStart = i12 + 1; tArr4[i12] = t2; i2++; this.mOldDataStart++; if (!this.mCallback.areContentsTheSame(t, t2)) { Callback callback = this.mCallback; callback.onChanged(this.mNewDataStart - 1, 1, callback.getChangePayload(t, t2)); } } } } this.mOldData = null; if (z2) { endBatchedUpdates(); } } private boolean remove(T t, boolean z2) { int findIndexOf = findIndexOf(t, this.mData, 0, this.mSize, 2); if (findIndexOf == -1) { return false; } removeItemAtIndex(findIndexOf, z2); return true; } private void removeItemAtIndex(int i, boolean z2) { T[] tArr = this.mData; System.arraycopy(tArr, i + 1, tArr, i, (this.mSize - i) - 1); int i2 = this.mSize - 1; this.mSize = i2; this.mData[i2] = null; if (z2) { this.mCallback.onRemoved(i, 1); } } private void replaceAllInsert(T t) { T[] tArr = this.mData; int i = this.mNewDataStart; tArr[i] = t; int i2 = i + 1; this.mNewDataStart = i2; this.mSize++; this.mCallback.onInserted(i2 - 1, 1); } private void replaceAllInternal(@NonNull T[] tArr) { boolean z2 = !(this.mCallback instanceof BatchedCallback); if (z2) { beginBatchedUpdates(); } this.mOldDataStart = 0; this.mOldDataSize = this.mSize; this.mOldData = this.mData; this.mNewDataStart = 0; int sortAndDedup = sortAndDedup(tArr); this.mData = (T[]) ((Object[]) Array.newInstance((Class) this.mTClass, sortAndDedup)); while (true) { int i = this.mNewDataStart; if (i >= sortAndDedup && this.mOldDataStart >= this.mOldDataSize) { break; } int i2 = this.mOldDataStart; int i3 = this.mOldDataSize; if (i2 >= i3) { int i4 = sortAndDedup - i; System.arraycopy(tArr, i, this.mData, i, i4); this.mNewDataStart += i4; this.mSize += i4; this.mCallback.onInserted(i, i4); break; } else if (i >= sortAndDedup) { int i5 = i3 - i2; this.mSize -= i5; this.mCallback.onRemoved(i, i5); break; } else { T t = this.mOldData[i2]; T t2 = tArr[i]; int compare = this.mCallback.compare(t, t2); if (compare < 0) { replaceAllRemove(); } else if (compare > 0) { replaceAllInsert(t2); } else if (!this.mCallback.areItemsTheSame(t, t2)) { replaceAllRemove(); replaceAllInsert(t2); } else { T[] tArr2 = this.mData; int i6 = this.mNewDataStart; tArr2[i6] = t2; this.mOldDataStart++; this.mNewDataStart = i6 + 1; if (!this.mCallback.areContentsTheSame(t, t2)) { Callback callback = this.mCallback; callback.onChanged(this.mNewDataStart - 1, 1, callback.getChangePayload(t, t2)); } } } } this.mOldData = null; if (z2) { endBatchedUpdates(); } } private void replaceAllRemove() { this.mSize--; this.mOldDataStart++; this.mCallback.onRemoved(this.mNewDataStart, 1); } private int sortAndDedup(@NonNull T[] tArr) { if (tArr.length == 0) { return 0; } Arrays.sort(tArr, this.mCallback); int i = 1; int i2 = 0; for (int i3 = 1; i3 < tArr.length; i3++) { T t = tArr[i3]; if (this.mCallback.compare(tArr[i2], t) == 0) { int findSameItem = findSameItem(t, tArr, i2, i); if (findSameItem != -1) { tArr[findSameItem] = t; } else { if (i != i3) { tArr[i] = t; } i++; } } else { if (i != i3) { tArr[i] = t; } i2 = i; i++; } } return i; } private void throwIfInMutationOperation() { if (this.mOldData != null) { throw new IllegalStateException("Data cannot be mutated in the middle of a batch update operation such as addAll or replaceAll."); } } public int add(T t) { throwIfInMutationOperation(); return add(t, true); } /* JADX DEBUG: Multi-variable search result rejected for r2v0, resolved type: androidx.recyclerview.widget.SortedList */ /* JADX WARN: Multi-variable type inference failed */ public void addAll(@NonNull Collection collection) { addAll(collection.toArray((Object[]) Array.newInstance((Class) this.mTClass, collection.size())), true); } public void addAll(@NonNull T... tArr) { addAll(tArr, false); } public void addAll(@NonNull T[] tArr, boolean z2) { throwIfInMutationOperation(); if (tArr.length != 0) { if (z2) { addAllInternal(tArr); } else { addAllInternal(copyArray(tArr)); } } } public void beginBatchedUpdates() { throwIfInMutationOperation(); Callback callback = this.mCallback; if (!(callback instanceof BatchedCallback)) { if (this.mBatchedCallback == null) { this.mBatchedCallback = new BatchedCallback(callback); } this.mCallback = this.mBatchedCallback; } } public void clear() { throwIfInMutationOperation(); int i = this.mSize; if (i != 0) { Arrays.fill(this.mData, 0, i, (Object) null); this.mSize = 0; this.mCallback.onRemoved(0, i); } } public void endBatchedUpdates() { throwIfInMutationOperation(); Callback callback = this.mCallback; if (callback instanceof BatchedCallback) { ((BatchedCallback) callback).dispatchLastEvent(); } Callback callback2 = this.mCallback; BatchedCallback batchedCallback = this.mBatchedCallback; if (callback2 == batchedCallback) { this.mCallback = batchedCallback.mWrappedCallback; } } public T get(int i) throws IndexOutOfBoundsException { int i2; if (i >= this.mSize || i < 0) { StringBuilder M = a.M("Asked to get item at ", i, " but size is "); M.append(this.mSize); throw new IndexOutOfBoundsException(M.toString()); } T[] tArr = this.mOldData; return (tArr == null || i < (i2 = this.mNewDataStart)) ? this.mData[i] : tArr[(i - i2) + this.mOldDataStart]; } public int indexOf(T t) { if (this.mOldData == null) { return findIndexOf(t, this.mData, 0, this.mSize, 4); } int findIndexOf = findIndexOf(t, this.mData, 0, this.mNewDataStart, 4); if (findIndexOf != -1) { return findIndexOf; } int findIndexOf2 = findIndexOf(t, this.mOldData, this.mOldDataStart, this.mOldDataSize, 4); if (findIndexOf2 != -1) { return (findIndexOf2 - this.mOldDataStart) + this.mNewDataStart; } return -1; } public void recalculatePositionOfItemAt(int i) { throwIfInMutationOperation(); T t = get(i); removeItemAtIndex(i, false); int add = add(t, false); if (i != add) { this.mCallback.onMoved(i, add); } } public boolean remove(T t) { throwIfInMutationOperation(); return remove(t, true); } public T removeItemAt(int i) { throwIfInMutationOperation(); T t = get(i); removeItemAtIndex(i, true); return t; } /* JADX DEBUG: Multi-variable search result rejected for r2v0, resolved type: androidx.recyclerview.widget.SortedList */ /* JADX WARN: Multi-variable type inference failed */ public void replaceAll(@NonNull Collection collection) { replaceAll(collection.toArray((Object[]) Array.newInstance((Class) this.mTClass, collection.size())), true); } public void replaceAll(@NonNull T... tArr) { replaceAll(tArr, false); } public void replaceAll(@NonNull T[] tArr, boolean z2) { throwIfInMutationOperation(); if (z2) { replaceAllInternal(tArr); } else { replaceAllInternal(copyArray(tArr)); } } public int size() { return this.mSize; } public void updateItemAt(int i, T t) { throwIfInMutationOperation(); T t2 = get(i); boolean z2 = t2 == t || !this.mCallback.areContentsTheSame(t2, t); if (t2 == t || this.mCallback.compare(t2, t) != 0) { if (z2) { Callback callback = this.mCallback; callback.onChanged(i, 1, callback.getChangePayload(t2, t)); } removeItemAtIndex(i, false); int add = add(t, false); if (i != add) { this.mCallback.onMoved(i, add); return; } return; } this.mData[i] = t; if (z2) { Callback callback2 = this.mCallback; callback2.onChanged(i, 1, callback2.getChangePayload(t2, t)); } } }