- Added realracing3-community.apk (71.57 MB) - Removed 32-bit support (armeabi-v7a) - Only includes arm64-v8a libraries - Decompiled source code included - Added README-community.md with analysis
408 lines
15 KiB
Java
408 lines
15 KiB
Java
package com.facebook.internal;
|
|
|
|
import android.graphics.Bitmap;
|
|
import android.net.Uri;
|
|
import android.os.Handler;
|
|
import android.os.Looper;
|
|
import androidx.annotation.VisibleForTesting;
|
|
import com.facebook.internal.ImageRequest;
|
|
import com.facebook.internal.WorkQueue;
|
|
import com.facebook.internal.instrument.crashshield.CrashShieldHandler;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
import kotlin.Unit;
|
|
import kotlin.jvm.internal.DefaultConstructorMarker;
|
|
import kotlin.jvm.internal.Intrinsics;
|
|
|
|
/* loaded from: classes2.dex */
|
|
public final class ImageDownloader {
|
|
private static final int CACHE_READ_QUEUE_MAX_CONCURRENT = 2;
|
|
private static final int DOWNLOAD_QUEUE_MAX_CONCURRENT = 8;
|
|
private static Handler handler;
|
|
public static final ImageDownloader INSTANCE = new ImageDownloader();
|
|
private static final WorkQueue downloadQueue = new WorkQueue(8, null, 2, null);
|
|
private static final WorkQueue cacheReadQueue = new WorkQueue(2, null, 2, null);
|
|
private static final Map<RequestKey, DownloaderContext> pendingRequests = new HashMap();
|
|
|
|
@VisibleForTesting(otherwise = 2)
|
|
public final Map<RequestKey, DownloaderContext> getPendingRequests() {
|
|
return pendingRequests;
|
|
}
|
|
|
|
private ImageDownloader() {
|
|
}
|
|
|
|
private final synchronized Handler getHandler() {
|
|
try {
|
|
if (handler == null) {
|
|
handler = new Handler(Looper.getMainLooper());
|
|
}
|
|
} catch (Throwable th) {
|
|
throw th;
|
|
}
|
|
return handler;
|
|
}
|
|
|
|
public static final void downloadAsync(ImageRequest imageRequest) {
|
|
if (imageRequest == null) {
|
|
return;
|
|
}
|
|
RequestKey requestKey = new RequestKey(imageRequest.getImageUri(), imageRequest.getCallerTag());
|
|
Map<RequestKey, DownloaderContext> map = pendingRequests;
|
|
synchronized (map) {
|
|
try {
|
|
DownloaderContext downloaderContext = map.get(requestKey);
|
|
if (downloaderContext != null) {
|
|
downloaderContext.setRequest(imageRequest);
|
|
downloaderContext.setCancelled(false);
|
|
WorkQueue.WorkItem workItem = downloaderContext.getWorkItem();
|
|
if (workItem != null) {
|
|
workItem.moveToFront();
|
|
Unit unit = Unit.INSTANCE;
|
|
}
|
|
} else {
|
|
INSTANCE.enqueueCacheRead(imageRequest, requestKey, imageRequest.isCachedRedirectAllowed());
|
|
Unit unit2 = Unit.INSTANCE;
|
|
}
|
|
} finally {
|
|
}
|
|
}
|
|
}
|
|
|
|
public static final boolean cancelRequest(ImageRequest request) {
|
|
boolean z;
|
|
Intrinsics.checkNotNullParameter(request, "request");
|
|
RequestKey requestKey = new RequestKey(request.getImageUri(), request.getCallerTag());
|
|
Map<RequestKey, DownloaderContext> map = pendingRequests;
|
|
synchronized (map) {
|
|
try {
|
|
DownloaderContext downloaderContext = map.get(requestKey);
|
|
if (downloaderContext != null) {
|
|
WorkQueue.WorkItem workItem = downloaderContext.getWorkItem();
|
|
z = true;
|
|
if (workItem != null && workItem.cancel()) {
|
|
map.remove(requestKey);
|
|
} else {
|
|
downloaderContext.setCancelled(true);
|
|
}
|
|
} else {
|
|
z = false;
|
|
}
|
|
Unit unit = Unit.INSTANCE;
|
|
} catch (Throwable th) {
|
|
throw th;
|
|
}
|
|
}
|
|
return z;
|
|
}
|
|
|
|
public static final void prioritizeRequest(ImageRequest request) {
|
|
WorkQueue.WorkItem workItem;
|
|
Intrinsics.checkNotNullParameter(request, "request");
|
|
RequestKey requestKey = new RequestKey(request.getImageUri(), request.getCallerTag());
|
|
Map<RequestKey, DownloaderContext> map = pendingRequests;
|
|
synchronized (map) {
|
|
try {
|
|
DownloaderContext downloaderContext = map.get(requestKey);
|
|
if (downloaderContext != null && (workItem = downloaderContext.getWorkItem()) != null) {
|
|
workItem.moveToFront();
|
|
}
|
|
Unit unit = Unit.INSTANCE;
|
|
} catch (Throwable th) {
|
|
throw th;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static final void clearCache() {
|
|
ImageResponseCache.clearCache();
|
|
UrlRedirectCache.clearCache();
|
|
}
|
|
|
|
private final void enqueueCacheRead(ImageRequest imageRequest, RequestKey requestKey, boolean z) {
|
|
enqueueRequest(imageRequest, requestKey, cacheReadQueue, new CacheReadWorkItem(requestKey, z));
|
|
}
|
|
|
|
private final void enqueueDownload(ImageRequest imageRequest, RequestKey requestKey) {
|
|
enqueueRequest(imageRequest, requestKey, downloadQueue, new DownloadImageWorkItem(requestKey));
|
|
}
|
|
|
|
private final void enqueueRequest(ImageRequest imageRequest, RequestKey requestKey, WorkQueue workQueue, Runnable runnable) {
|
|
Map<RequestKey, DownloaderContext> map = pendingRequests;
|
|
synchronized (map) {
|
|
DownloaderContext downloaderContext = new DownloaderContext(imageRequest);
|
|
map.put(requestKey, downloaderContext);
|
|
downloaderContext.setWorkItem(WorkQueue.addActiveWorkItem$default(workQueue, runnable, false, 2, null));
|
|
Unit unit = Unit.INSTANCE;
|
|
}
|
|
}
|
|
|
|
private final void issueResponse(RequestKey requestKey, final Exception exc, final Bitmap bitmap, final boolean z) {
|
|
Handler handler2;
|
|
DownloaderContext removePendingRequest = removePendingRequest(requestKey);
|
|
if (removePendingRequest == null || removePendingRequest.isCancelled()) {
|
|
return;
|
|
}
|
|
final ImageRequest request = removePendingRequest.getRequest();
|
|
final ImageRequest.Callback callback = request == null ? null : request.getCallback();
|
|
if (callback == null || (handler2 = getHandler()) == null) {
|
|
return;
|
|
}
|
|
handler2.post(new Runnable() { // from class: com.facebook.internal.ImageDownloader$$ExternalSyntheticLambda0
|
|
@Override // java.lang.Runnable
|
|
public final void run() {
|
|
ImageDownloader.m573issueResponse$lambda4(ImageRequest.this, exc, z, bitmap, callback);
|
|
}
|
|
});
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
/* renamed from: issueResponse$lambda-4, reason: not valid java name */
|
|
public static final void m573issueResponse$lambda4(ImageRequest request, Exception exc, boolean z, Bitmap bitmap, ImageRequest.Callback callback) {
|
|
Intrinsics.checkNotNullParameter(request, "$request");
|
|
callback.onCompleted(new ImageResponse(request, exc, z, bitmap));
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
/* JADX WARN: Removed duplicated region for block: B:11:0x0027 */
|
|
/* JADX WARN: Removed duplicated region for block: B:14:0x0032 */
|
|
/* JADX WARN: Removed duplicated region for block: B:9:0x001b */
|
|
/*
|
|
Code decompiled incorrectly, please refer to instructions dump.
|
|
To view partially-correct add '--show-bad-code' argument
|
|
*/
|
|
public final void readFromCache(com.facebook.internal.ImageDownloader.RequestKey r4, boolean r5) {
|
|
/*
|
|
r3 = this;
|
|
r0 = 0
|
|
r1 = 0
|
|
if (r5 == 0) goto L18
|
|
com.facebook.internal.UrlRedirectCache r5 = com.facebook.internal.UrlRedirectCache.INSTANCE
|
|
android.net.Uri r5 = r4.getUri()
|
|
android.net.Uri r5 = com.facebook.internal.UrlRedirectCache.getRedirectedUri(r5)
|
|
if (r5 == 0) goto L18
|
|
java.io.InputStream r5 = com.facebook.internal.ImageResponseCache.getCachedImageStream(r5)
|
|
if (r5 == 0) goto L19
|
|
r1 = 1
|
|
goto L19
|
|
L18:
|
|
r5 = r0
|
|
L19:
|
|
if (r1 != 0) goto L25
|
|
com.facebook.internal.ImageResponseCache r5 = com.facebook.internal.ImageResponseCache.INSTANCE
|
|
android.net.Uri r5 = r4.getUri()
|
|
java.io.InputStream r5 = com.facebook.internal.ImageResponseCache.getCachedImageStream(r5)
|
|
L25:
|
|
if (r5 == 0) goto L32
|
|
android.graphics.Bitmap r2 = android.graphics.BitmapFactory.decodeStream(r5)
|
|
com.facebook.internal.Utility.closeQuietly(r5)
|
|
r3.issueResponse(r4, r0, r2, r1)
|
|
goto L4a
|
|
L32:
|
|
com.facebook.internal.ImageDownloader$DownloaderContext r5 = r3.removePendingRequest(r4)
|
|
if (r5 != 0) goto L39
|
|
goto L3d
|
|
L39:
|
|
com.facebook.internal.ImageRequest r0 = r5.getRequest()
|
|
L3d:
|
|
if (r5 == 0) goto L4a
|
|
boolean r5 = r5.isCancelled()
|
|
if (r5 != 0) goto L4a
|
|
if (r0 == 0) goto L4a
|
|
r3.enqueueDownload(r0, r4)
|
|
L4a:
|
|
return
|
|
*/
|
|
throw new UnsupportedOperationException("Method not decompiled: com.facebook.internal.ImageDownloader.readFromCache(com.facebook.internal.ImageDownloader$RequestKey, boolean):void");
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
/* JADX WARN: Removed duplicated region for block: B:28:0x00e5 */
|
|
/* JADX WARN: Removed duplicated region for block: B:31:? A[RETURN, SYNTHETIC] */
|
|
/* JADX WARN: Type inference failed for: r4v6, types: [int] */
|
|
/*
|
|
Code decompiled incorrectly, please refer to instructions dump.
|
|
To view partially-correct add '--show-bad-code' argument
|
|
*/
|
|
public final void download(com.facebook.internal.ImageDownloader.RequestKey r11) {
|
|
/*
|
|
Method dump skipped, instructions count: 233
|
|
To view this dump add '--comments-level debug' option
|
|
*/
|
|
throw new UnsupportedOperationException("Method not decompiled: com.facebook.internal.ImageDownloader.download(com.facebook.internal.ImageDownloader$RequestKey):void");
|
|
}
|
|
|
|
private final DownloaderContext removePendingRequest(RequestKey requestKey) {
|
|
DownloaderContext remove;
|
|
Map<RequestKey, DownloaderContext> map = pendingRequests;
|
|
synchronized (map) {
|
|
remove = map.remove(requestKey);
|
|
}
|
|
return remove;
|
|
}
|
|
|
|
@VisibleForTesting(otherwise = 2)
|
|
public static final class RequestKey {
|
|
public static final Companion Companion = new Companion(null);
|
|
private static final int HASH_MULTIPLIER = 37;
|
|
private static final int HASH_SEED = 29;
|
|
private Object tag;
|
|
private Uri uri;
|
|
|
|
public final Object getTag() {
|
|
return this.tag;
|
|
}
|
|
|
|
public final Uri getUri() {
|
|
return this.uri;
|
|
}
|
|
|
|
public final void setTag(Object obj) {
|
|
Intrinsics.checkNotNullParameter(obj, "<set-?>");
|
|
this.tag = obj;
|
|
}
|
|
|
|
public final void setUri(Uri uri) {
|
|
Intrinsics.checkNotNullParameter(uri, "<set-?>");
|
|
this.uri = uri;
|
|
}
|
|
|
|
public RequestKey(Uri uri, Object tag) {
|
|
Intrinsics.checkNotNullParameter(uri, "uri");
|
|
Intrinsics.checkNotNullParameter(tag, "tag");
|
|
this.uri = uri;
|
|
this.tag = tag;
|
|
}
|
|
|
|
public int hashCode() {
|
|
return ((1073 + this.uri.hashCode()) * 37) + this.tag.hashCode();
|
|
}
|
|
|
|
public boolean equals(Object obj) {
|
|
if (obj == null || !(obj instanceof RequestKey)) {
|
|
return false;
|
|
}
|
|
RequestKey requestKey = (RequestKey) obj;
|
|
return requestKey.uri == this.uri && requestKey.tag == this.tag;
|
|
}
|
|
|
|
public static final class Companion {
|
|
public /* synthetic */ Companion(DefaultConstructorMarker defaultConstructorMarker) {
|
|
this();
|
|
}
|
|
|
|
private Companion() {
|
|
}
|
|
}
|
|
}
|
|
|
|
@VisibleForTesting(otherwise = 2)
|
|
public static final class DownloaderContext {
|
|
private boolean isCancelled;
|
|
private ImageRequest request;
|
|
private WorkQueue.WorkItem workItem;
|
|
|
|
public final ImageRequest getRequest() {
|
|
return this.request;
|
|
}
|
|
|
|
public final WorkQueue.WorkItem getWorkItem() {
|
|
return this.workItem;
|
|
}
|
|
|
|
public final boolean isCancelled() {
|
|
return this.isCancelled;
|
|
}
|
|
|
|
public final void setCancelled(boolean z) {
|
|
this.isCancelled = z;
|
|
}
|
|
|
|
public final void setRequest(ImageRequest imageRequest) {
|
|
Intrinsics.checkNotNullParameter(imageRequest, "<set-?>");
|
|
this.request = imageRequest;
|
|
}
|
|
|
|
public final void setWorkItem(WorkQueue.WorkItem workItem) {
|
|
this.workItem = workItem;
|
|
}
|
|
|
|
public DownloaderContext(ImageRequest request) {
|
|
Intrinsics.checkNotNullParameter(request, "request");
|
|
this.request = request;
|
|
}
|
|
}
|
|
|
|
public static final class CacheReadWorkItem implements Runnable {
|
|
private final boolean allowCachedRedirects;
|
|
private final RequestKey key;
|
|
|
|
public CacheReadWorkItem(RequestKey key, boolean z) {
|
|
Intrinsics.checkNotNullParameter(key, "key");
|
|
this.key = key;
|
|
this.allowCachedRedirects = z;
|
|
}
|
|
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
if (CrashShieldHandler.isObjectCrashing(this)) {
|
|
return;
|
|
}
|
|
try {
|
|
if (CrashShieldHandler.isObjectCrashing(this)) {
|
|
return;
|
|
}
|
|
try {
|
|
if (CrashShieldHandler.isObjectCrashing(this)) {
|
|
return;
|
|
}
|
|
try {
|
|
ImageDownloader.INSTANCE.readFromCache(this.key, this.allowCachedRedirects);
|
|
} catch (Throwable th) {
|
|
CrashShieldHandler.handleThrowable(th, this);
|
|
}
|
|
} catch (Throwable th2) {
|
|
CrashShieldHandler.handleThrowable(th2, this);
|
|
}
|
|
} catch (Throwable th3) {
|
|
CrashShieldHandler.handleThrowable(th3, this);
|
|
}
|
|
}
|
|
}
|
|
|
|
public static final class DownloadImageWorkItem implements Runnable {
|
|
private final RequestKey key;
|
|
|
|
public DownloadImageWorkItem(RequestKey key) {
|
|
Intrinsics.checkNotNullParameter(key, "key");
|
|
this.key = key;
|
|
}
|
|
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
if (CrashShieldHandler.isObjectCrashing(this)) {
|
|
return;
|
|
}
|
|
try {
|
|
if (CrashShieldHandler.isObjectCrashing(this)) {
|
|
return;
|
|
}
|
|
try {
|
|
if (CrashShieldHandler.isObjectCrashing(this)) {
|
|
return;
|
|
}
|
|
try {
|
|
ImageDownloader.INSTANCE.download(this.key);
|
|
} catch (Throwable th) {
|
|
CrashShieldHandler.handleThrowable(th, this);
|
|
}
|
|
} catch (Throwable th2) {
|
|
CrashShieldHandler.handleThrowable(th2, this);
|
|
}
|
|
} catch (Throwable th3) {
|
|
CrashShieldHandler.handleThrowable(th3, this);
|
|
}
|
|
}
|
|
}
|
|
}
|