CrackMe.apk
Download file
package androidx.recyclerview.widget;
import android.os.Handler;
import android.os.Looper;
import androidx.recyclerview.widget.AsyncDifferConfig;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.RecyclerView;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executor;
public class AsyncListDiffer<T> {
private static final Executor sMainThreadExecutor = new MainThreadExecutor();
final AsyncDifferConfig<T> mConfig;
private List<T> mList;
private final List<ListListener<T>> mListeners;
Executor mMainThreadExecutor;
int mMaxScheduledGeneration;
private List<T> mReadOnlyList;
private final ListUpdateCallback mUpdateCallback;
public interface ListListener<T> {
void onCurrentListChanged(List<T> list, List<T> list2);
}
private static class MainThreadExecutor implements Executor {
final Handler mHandler = new Handler(Looper.getMainLooper());
MainThreadExecutor() {
}
public void execute(Runnable runnable) {
this.mHandler.post(runnable);
}
}
public AsyncListDiffer(RecyclerView.Adapter adapter, DiffUtil.ItemCallback<T> itemCallback) {
this((ListUpdateCallback) new AdapterListUpdateCallback(adapter), new AsyncDifferConfig.Builder(itemCallback).build());
}
public AsyncListDiffer(ListUpdateCallback listUpdateCallback, AsyncDifferConfig<T> asyncDifferConfig) {
this.mListeners = new CopyOnWriteArrayList();
this.mReadOnlyList = Collections.emptyList();
this.mUpdateCallback = listUpdateCallback;
this.mConfig = asyncDifferConfig;
if (asyncDifferConfig.getMainThreadExecutor() != null) {
this.mMainThreadExecutor = asyncDifferConfig.getMainThreadExecutor();
} else {
this.mMainThreadExecutor = sMainThreadExecutor;
}
}
public List<T> getCurrentList() {
return this.mReadOnlyList;
}
public void submitList(List<T> list) {
submitList(list, (Runnable) null);
}
public void submitList(List<T> list, Runnable runnable) {
final int i = this.mMaxScheduledGeneration + 1;
this.mMaxScheduledGeneration = i;
final List<T> list2 = this.mList;
if (list != list2) {
List<T> list3 = this.mReadOnlyList;
if (list == null) {
int size = list2.size();
this.mList = null;
this.mReadOnlyList = Collections.emptyList();
this.mUpdateCallback.onRemoved(0, size);
onCurrentListChanged(list3, runnable);
} else if (list2 == null) {
this.mList = list;
this.mReadOnlyList = Collections.unmodifiableList(list);
this.mUpdateCallback.onInserted(0, list.size());
onCurrentListChanged(list3, runnable);
} else {
final List<T> list4 = list;
final Runnable runnable2 = runnable;
this.mConfig.getBackgroundThreadExecutor().execute(new Runnable() {
public void run() {
final DiffUtil.DiffResult calculateDiff = DiffUtil.calculateDiff(new DiffUtil.Callback() {
public int getOldListSize() {
return list2.size();
}
public int getNewListSize() {
return list4.size();
}
public boolean areItemsTheSame(int i, int i2) {
Object obj = list2.get(i);
Object obj2 = list4.get(i2);
if (obj == null || obj2 == null) {
return obj == null && obj2 == null;
}
return AsyncListDiffer.this.mConfig.getDiffCallback().areItemsTheSame(obj, obj2);
}
public boolean areContentsTheSame(int i, int i2) {
Object obj = list2.get(i);
Object obj2 = list4.get(i2);
if (obj != null && obj2 != null) {
return AsyncListDiffer.this.mConfig.getDiffCallback().areContentsTheSame(obj, obj2);
}
if (obj == null && obj2 == null) {
return true;
}
throw new AssertionError();
}
public Object getChangePayload(int i, int i2) {
Object obj = list2.get(i);
Object obj2 = list4.get(i2);
if (obj != null && obj2 != null) {
return AsyncListDiffer.this.mConfig.getDiffCallback().getChangePayload(obj, obj2);
}
throw new AssertionError();
}
});
AsyncListDiffer.this.mMainThreadExecutor.execute(new Runnable() {
public void run() {
if (AsyncListDiffer.this.mMaxScheduledGeneration == i) {
AsyncListDiffer.this.latchList(list4, calculateDiff, runnable2);
}
}
});
}
});
}
} else if (runnable != null) {
runnable.run();
}
}
/* access modifiers changed from: package-private */
public void latchList(List<T> list, DiffUtil.DiffResult diffResult, Runnable runnable) {
List<T> list2 = this.mReadOnlyList;
this.mList = list;
this.mReadOnlyList = Collections.unmodifiableList(list);
diffResult.dispatchUpdatesTo(this.mUpdateCallback);
onCurrentListChanged(list2, runnable);
}
private void onCurrentListChanged(List<T> list, Runnable runnable) {
for (ListListener<T> onCurrentListChanged : this.mListeners) {
onCurrentListChanged.onCurrentListChanged(list, this.mReadOnlyList);
}
if (runnable != null) {
runnable.run();
}
}
public void addListListener(ListListener<T> listListener) {
this.mListeners.add(listListener);
}
public void removeListListener(ListListener<T> listListener) {
this.mListeners.remove(listListener);
}
}
Download file