CrackMe.apk
Download file
package bolts;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.CancellationException;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
public class Task<TResult> {
public static final ExecutorService BACKGROUND_EXECUTOR = BoltsExecutors.background();
private static final Executor IMMEDIATE_EXECUTOR = BoltsExecutors.immediate();
private static Task<?> TASK_CANCELLED = new Task<>(true);
private static Task<Boolean> TASK_FALSE = new Task<>(false);
private static Task<?> TASK_NULL = new Task<>((Object) null);
private static Task<Boolean> TASK_TRUE = new Task<>(true);
public static final Executor UI_THREAD_EXECUTOR = AndroidExecutors.uiThread();
private static volatile UnobservedExceptionHandler unobservedExceptionHandler;
private boolean cancelled;
private boolean complete;
private List<Continuation<TResult, Void>> continuations = new ArrayList();
private Exception error;
private boolean errorHasBeenObserved;
private final Object lock = new Object();
private TResult result;
private UnobservedErrorNotifier unobservedErrorNotifier;
public interface UnobservedExceptionHandler {
void unobservedException(Task<?> task, UnobservedTaskException unobservedTaskException);
}
public <TOut> Task<TOut> cast() {
return this;
}
public static UnobservedExceptionHandler getUnobservedExceptionHandler() {
return unobservedExceptionHandler;
}
public static void setUnobservedExceptionHandler(UnobservedExceptionHandler unobservedExceptionHandler2) {
unobservedExceptionHandler = unobservedExceptionHandler2;
}
Task() {
}
private Task(TResult tresult) {
trySetResult(tresult);
}
private Task(boolean z) {
if (z) {
trySetCancelled();
} else {
trySetResult((Object) null);
}
}
public static <TResult> Task<TResult>.TaskCompletionSource create() {
return new TaskCompletionSource();
}
public boolean isCompleted() {
boolean z;
synchronized (this.lock) {
z = this.complete;
}
return z;
}
public boolean isCancelled() {
boolean z;
synchronized (this.lock) {
z = this.cancelled;
}
return z;
}
public boolean isFaulted() {
boolean z;
synchronized (this.lock) {
z = getError() != null;
}
return z;
}
public TResult getResult() {
TResult tresult;
synchronized (this.lock) {
tresult = this.result;
}
return tresult;
}
public Exception getError() {
Exception exc;
synchronized (this.lock) {
if (this.error != null) {
this.errorHasBeenObserved = true;
UnobservedErrorNotifier unobservedErrorNotifier2 = this.unobservedErrorNotifier;
if (unobservedErrorNotifier2 != null) {
unobservedErrorNotifier2.setObserved();
this.unobservedErrorNotifier = null;
}
}
exc = this.error;
}
return exc;
}
public void waitForCompletion() throws InterruptedException {
synchronized (this.lock) {
if (!isCompleted()) {
this.lock.wait();
}
}
}
public boolean waitForCompletion(long j, TimeUnit timeUnit) throws InterruptedException {
boolean isCompleted;
synchronized (this.lock) {
if (!isCompleted()) {
this.lock.wait(timeUnit.toMillis(j));
}
isCompleted = isCompleted();
}
return isCompleted;
}
public static <TResult> Task<TResult> forResult(TResult tresult) {
if (tresult == null) {
return TASK_NULL;
}
if (tresult instanceof Boolean) {
return ((Boolean) tresult).booleanValue() ? TASK_TRUE : TASK_FALSE;
}
TaskCompletionSource taskCompletionSource = new TaskCompletionSource();
taskCompletionSource.setResult(tresult);
return taskCompletionSource.getTask();
}
public static <TResult> Task<TResult> forError(Exception exc) {
TaskCompletionSource taskCompletionSource = new TaskCompletionSource();
taskCompletionSource.setError(exc);
return taskCompletionSource.getTask();
}
public static <TResult> Task<TResult> cancelled() {
return TASK_CANCELLED;
}
public static Task<Void> delay(long j) {
return delay(j, BoltsExecutors.scheduled(), (CancellationToken) null);
}
public static Task<Void> delay(long j, CancellationToken cancellationToken) {
return delay(j, BoltsExecutors.scheduled(), cancellationToken);
}
static Task<Void> delay(long j, ScheduledExecutorService scheduledExecutorService, CancellationToken cancellationToken) {
if (cancellationToken != null && cancellationToken.isCancellationRequested()) {
return cancelled();
}
if (j <= 0) {
return forResult((Object) null);
}
final TaskCompletionSource taskCompletionSource = new TaskCompletionSource();
final ScheduledFuture<?> schedule = scheduledExecutorService.schedule(new Runnable() {
public void run() {
taskCompletionSource.trySetResult(null);
}
}, j, TimeUnit.MILLISECONDS);
if (cancellationToken != null) {
cancellationToken.register(new Runnable() {
public void run() {
schedule.cancel(true);
taskCompletionSource.trySetCancelled();
}
});
}
return taskCompletionSource.getTask();
}
public Task<Void> makeVoid() {
return continueWithTask(new Continuation<TResult, Task<Void>>() {
public Task<Void> then(Task<TResult> task) throws Exception {
if (task.isCancelled()) {
return Task.cancelled();
}
if (task.isFaulted()) {
return Task.forError(task.getError());
}
return Task.forResult(null);
}
});
}
public static <TResult> Task<TResult> callInBackground(Callable<TResult> callable) {
return call(callable, BACKGROUND_EXECUTOR, (CancellationToken) null);
}
public static <TResult> Task<TResult> callInBackground(Callable<TResult> callable, CancellationToken cancellationToken) {
return call(callable, BACKGROUND_EXECUTOR, cancellationToken);
}
public static <TResult> Task<TResult> call(Callable<TResult> callable, Executor executor) {
return call(callable, executor, (CancellationToken) null);
}
public static <TResult> Task<TResult> call(final Callable<TResult> callable, Executor executor, final CancellationToken cancellationToken) {
final TaskCompletionSource taskCompletionSource = new TaskCompletionSource();
try {
executor.execute(new Runnable() {
public void run() {
CancellationToken cancellationToken = cancellationToken;
if (cancellationToken == null || !cancellationToken.isCancellationRequested()) {
try {
taskCompletionSource.setResult(callable.call());
} catch (CancellationException unused) {
taskCompletionSource.setCancelled();
} catch (Exception e) {
taskCompletionSource.setError(e);
}
} else {
taskCompletionSource.setCancelled();
}
}
});
} catch (Exception e) {
taskCompletionSource.setError(new ExecutorException(e));
}
return taskCompletionSource.getTask();
}
public static <TResult> Task<TResult> call(Callable<TResult> callable) {
return call(callable, IMMEDIATE_EXECUTOR, (CancellationToken) null);
}
public static <TResult> Task<TResult> call(Callable<TResult> callable, CancellationToken cancellationToken) {
return call(callable, IMMEDIATE_EXECUTOR, cancellationToken);
}
public static <TResult> Task<Task<TResult>> whenAnyResult(Collection<? extends Task<TResult>> collection) {
if (collection.size() == 0) {
return forResult((Object) null);
}
final TaskCompletionSource taskCompletionSource = new TaskCompletionSource();
final AtomicBoolean atomicBoolean = new AtomicBoolean(false);
for (Task continueWith : collection) {
continueWith.continueWith(new Continuation<TResult, Void>() {
public Void then(Task<TResult> task) {
if (atomicBoolean.compareAndSet(false, true)) {
taskCompletionSource.setResult(task);
return null;
}
task.getError();
return null;
}
});
}
return taskCompletionSource.getTask();
}
public static Task<Task<?>> whenAny(Collection<? extends Task<?>> collection) {
if (collection.size() == 0) {
return forResult((Object) null);
}
final TaskCompletionSource taskCompletionSource = new TaskCompletionSource();
final AtomicBoolean atomicBoolean = new AtomicBoolean(false);
for (Task continueWith : collection) {
continueWith.continueWith(new Continuation<Object, Void>() {
public Void then(Task<Object> task) {
if (atomicBoolean.compareAndSet(false, true)) {
taskCompletionSource.setResult(task);
return null;
}
task.getError();
return null;
}
});
}
return taskCompletionSource.getTask();
}
public static <TResult> Task<List<TResult>> whenAllResult(final Collection<? extends Task<TResult>> collection) {
return whenAll(collection).onSuccess(new Continuation<Void, List<TResult>>() {
public List<TResult> then(Task<Void> task) throws Exception {
if (collection.size() == 0) {
return Collections.emptyList();
}
ArrayList arrayList = new ArrayList();
for (Task result : collection) {
arrayList.add(result.getResult());
}
return arrayList;
}
});
}
public static Task<Void> whenAll(Collection<? extends Task<?>> collection) {
if (collection.size() == 0) {
return forResult((Object) null);
}
TaskCompletionSource taskCompletionSource = new TaskCompletionSource();
ArrayList arrayList = new ArrayList();
Object obj = new Object();
AtomicInteger atomicInteger = new AtomicInteger(collection.size());
AtomicBoolean atomicBoolean = new AtomicBoolean(false);
for (Task continueWith : collection) {
final Object obj2 = obj;
final ArrayList arrayList2 = arrayList;
final AtomicBoolean atomicBoolean2 = atomicBoolean;
final AtomicInteger atomicInteger2 = atomicInteger;
final TaskCompletionSource taskCompletionSource2 = taskCompletionSource;
continueWith.continueWith(new Continuation<Object, Void>() {
public Void then(Task<Object> task) {
if (task.isFaulted()) {
synchronized (obj2) {
arrayList2.add(task.getError());
}
}
if (task.isCancelled()) {
atomicBoolean2.set(true);
}
if (atomicInteger2.decrementAndGet() == 0) {
if (arrayList2.size() != 0) {
if (arrayList2.size() == 1) {
taskCompletionSource2.setError((Exception) arrayList2.get(0));
} else {
taskCompletionSource2.setError(new AggregateException(String.format("There were %d exceptions.", new Object[]{Integer.valueOf(arrayList2.size())}), (List<? extends Throwable>) arrayList2));
}
} else if (atomicBoolean2.get()) {
taskCompletionSource2.setCancelled();
} else {
taskCompletionSource2.setResult(null);
}
}
return null;
}
});
}
return taskCompletionSource.getTask();
}
public Task<Void> continueWhile(Callable<Boolean> callable, Continuation<Void, Task<Void>> continuation) {
return continueWhile(callable, continuation, IMMEDIATE_EXECUTOR, (CancellationToken) null);
}
public Task<Void> continueWhile(Callable<Boolean> callable, Continuation<Void, Task<Void>> continuation, CancellationToken cancellationToken) {
return continueWhile(callable, continuation, IMMEDIATE_EXECUTOR, cancellationToken);
}
public Task<Void> continueWhile(Callable<Boolean> callable, Continuation<Void, Task<Void>> continuation, Executor executor) {
return continueWhile(callable, continuation, executor, (CancellationToken) null);
}
public Task<Void> continueWhile(Callable<Boolean> callable, Continuation<Void, Task<Void>> continuation, Executor executor, CancellationToken cancellationToken) {
Capture capture = new Capture();
final CancellationToken cancellationToken2 = cancellationToken;
final Callable<Boolean> callable2 = callable;
final Continuation<Void, Task<Void>> continuation2 = continuation;
final Executor executor2 = executor;
final Capture capture2 = capture;
capture.set(new Continuation<Void, Task<Void>>() {
public Task<Void> then(Task<Void> task) throws Exception {
CancellationToken cancellationToken = cancellationToken2;
if (cancellationToken != null && cancellationToken.isCancellationRequested()) {
return Task.cancelled();
}
if (((Boolean) callable2.call()).booleanValue()) {
return Task.forResult(null).onSuccessTask(continuation2, executor2).onSuccessTask((Continuation) capture2.get(), executor2);
}
return Task.forResult(null);
}
});
return makeVoid().continueWithTask((Continuation) capture.get(), executor);
}
public <TContinuationResult> Task<TContinuationResult> continueWith(Continuation<TResult, TContinuationResult> continuation, Executor executor) {
return continueWith(continuation, executor, (CancellationToken) null);
}
public <TContinuationResult> Task<TContinuationResult> continueWith(Continuation<TResult, TContinuationResult> continuation, Executor executor, CancellationToken cancellationToken) {
boolean isCompleted;
TaskCompletionSource taskCompletionSource = new TaskCompletionSource();
synchronized (this.lock) {
isCompleted = isCompleted();
if (!isCompleted) {
final TaskCompletionSource taskCompletionSource2 = taskCompletionSource;
final Continuation<TResult, TContinuationResult> continuation2 = continuation;
final Executor executor2 = executor;
final CancellationToken cancellationToken2 = cancellationToken;
this.continuations.add(new Continuation<TResult, Void>() {
public Void then(Task<TResult> task) {
Task.completeImmediately(taskCompletionSource2, continuation2, task, executor2, cancellationToken2);
return null;
}
});
}
}
if (isCompleted) {
completeImmediately(taskCompletionSource, continuation, this, executor, cancellationToken);
}
return taskCompletionSource.getTask();
}
public <TContinuationResult> Task<TContinuationResult> continueWith(Continuation<TResult, TContinuationResult> continuation) {
return continueWith(continuation, IMMEDIATE_EXECUTOR, (CancellationToken) null);
}
public <TContinuationResult> Task<TContinuationResult> continueWith(Continuation<TResult, TContinuationResult> continuation, CancellationToken cancellationToken) {
return continueWith(continuation, IMMEDIATE_EXECUTOR, cancellationToken);
}
public <TContinuationResult> Task<TContinuationResult> continueWithTask(Continuation<TResult, Task<TContinuationResult>> continuation, Executor executor) {
return continueWithTask(continuation, executor, (CancellationToken) null);
}
public <TContinuationResult> Task<TContinuationResult> continueWithTask(Continuation<TResult, Task<TContinuationResult>> continuation, Executor executor, CancellationToken cancellationToken) {
boolean isCompleted;
TaskCompletionSource taskCompletionSource = new TaskCompletionSource();
synchronized (this.lock) {
isCompleted = isCompleted();
if (!isCompleted) {
final TaskCompletionSource taskCompletionSource2 = taskCompletionSource;
final Continuation<TResult, Task<TContinuationResult>> continuation2 = continuation;
final Executor executor2 = executor;
final CancellationToken cancellationToken2 = cancellationToken;
this.continuations.add(new Continuation<TResult, Void>() {
public Void then(Task<TResult> task) {
Task.completeAfterTask(taskCompletionSource2, continuation2, task, executor2, cancellationToken2);
return null;
}
});
}
}
if (isCompleted) {
completeAfterTask(taskCompletionSource, continuation, this, executor, cancellationToken);
}
return taskCompletionSource.getTask();
}
public <TContinuationResult> Task<TContinuationResult> continueWithTask(Continuation<TResult, Task<TContinuationResult>> continuation) {
return continueWithTask(continuation, IMMEDIATE_EXECUTOR, (CancellationToken) null);
}
public <TContinuationResult> Task<TContinuationResult> continueWithTask(Continuation<TResult, Task<TContinuationResult>> continuation, CancellationToken cancellationToken) {
return continueWithTask(continuation, IMMEDIATE_EXECUTOR, cancellationToken);
}
public <TContinuationResult> Task<TContinuationResult> onSuccess(Continuation<TResult, TContinuationResult> continuation, Executor executor) {
return onSuccess(continuation, executor, (CancellationToken) null);
}
public <TContinuationResult> Task<TContinuationResult> onSuccess(final Continuation<TResult, TContinuationResult> continuation, Executor executor, final CancellationToken cancellationToken) {
return continueWithTask(new Continuation<TResult, Task<TContinuationResult>>() {
public Task<TContinuationResult> then(Task<TResult> task) {
CancellationToken cancellationToken = cancellationToken;
if (cancellationToken != null && cancellationToken.isCancellationRequested()) {
return Task.cancelled();
}
if (task.isFaulted()) {
return Task.forError(task.getError());
}
if (task.isCancelled()) {
return Task.cancelled();
}
return task.continueWith(continuation);
}
}, executor);
}
public <TContinuationResult> Task<TContinuationResult> onSuccess(Continuation<TResult, TContinuationResult> continuation) {
return onSuccess(continuation, IMMEDIATE_EXECUTOR, (CancellationToken) null);
}
public <TContinuationResult> Task<TContinuationResult> onSuccess(Continuation<TResult, TContinuationResult> continuation, CancellationToken cancellationToken) {
return onSuccess(continuation, IMMEDIATE_EXECUTOR, cancellationToken);
}
public <TContinuationResult> Task<TContinuationResult> onSuccessTask(Continuation<TResult, Task<TContinuationResult>> continuation, Executor executor) {
return onSuccessTask(continuation, executor, (CancellationToken) null);
}
public <TContinuationResult> Task<TContinuationResult> onSuccessTask(final Continuation<TResult, Task<TContinuationResult>> continuation, Executor executor, final CancellationToken cancellationToken) {
return continueWithTask(new Continuation<TResult, Task<TContinuationResult>>() {
public Task<TContinuationResult> then(Task<TResult> task) {
CancellationToken cancellationToken = cancellationToken;
if (cancellationToken != null && cancellationToken.isCancellationRequested()) {
return Task.cancelled();
}
if (task.isFaulted()) {
return Task.forError(task.getError());
}
if (task.isCancelled()) {
return Task.cancelled();
}
return task.continueWithTask(continuation);
}
}, executor);
}
public <TContinuationResult> Task<TContinuationResult> onSuccessTask(Continuation<TResult, Task<TContinuationResult>> continuation) {
return onSuccessTask(continuation, IMMEDIATE_EXECUTOR);
}
public <TContinuationResult> Task<TContinuationResult> onSuccessTask(Continuation<TResult, Task<TContinuationResult>> continuation, CancellationToken cancellationToken) {
return onSuccessTask(continuation, IMMEDIATE_EXECUTOR, cancellationToken);
}
/* access modifiers changed from: private */
public static <TContinuationResult, TResult> void completeImmediately(final TaskCompletionSource<TContinuationResult> taskCompletionSource, final Continuation<TResult, TContinuationResult> continuation, final Task<TResult> task, Executor executor, final CancellationToken cancellationToken) {
try {
executor.execute(new Runnable() {
public void run() {
CancellationToken cancellationToken = cancellationToken;
if (cancellationToken == null || !cancellationToken.isCancellationRequested()) {
try {
taskCompletionSource.setResult(continuation.then(task));
} catch (CancellationException unused) {
taskCompletionSource.setCancelled();
} catch (Exception e) {
taskCompletionSource.setError(e);
}
} else {
taskCompletionSource.setCancelled();
}
}
});
} catch (Exception e) {
taskCompletionSource.setError(new ExecutorException(e));
}
}
/* access modifiers changed from: private */
public static <TContinuationResult, TResult> void completeAfterTask(final TaskCompletionSource<TContinuationResult> taskCompletionSource, final Continuation<TResult, Task<TContinuationResult>> continuation, final Task<TResult> task, Executor executor, final CancellationToken cancellationToken) {
try {
executor.execute(new Runnable() {
public void run() {
CancellationToken cancellationToken = cancellationToken;
if (cancellationToken == null || !cancellationToken.isCancellationRequested()) {
try {
Task task = (Task) continuation.then(task);
if (task == null) {
taskCompletionSource.setResult(null);
} else {
task.continueWith(new Continuation<TContinuationResult, Void>() {
public Void then(Task<TContinuationResult> task) {
if (cancellationToken == null || !cancellationToken.isCancellationRequested()) {
if (task.isCancelled()) {
taskCompletionSource.setCancelled();
} else if (task.isFaulted()) {
taskCompletionSource.setError(task.getError());
} else {
taskCompletionSource.setResult(task.getResult());
}
return null;
}
taskCompletionSource.setCancelled();
return null;
}
});
}
} catch (CancellationException unused) {
taskCompletionSource.setCancelled();
} catch (Exception e) {
taskCompletionSource.setError(e);
}
} else {
taskCompletionSource.setCancelled();
}
}
});
} catch (Exception e) {
taskCompletionSource.setError(new ExecutorException(e));
}
}
private void runContinuations() {
synchronized (this.lock) {
for (Continuation then : this.continuations) {
try {
then.then(this);
} catch (RuntimeException e) {
throw e;
} catch (Exception e2) {
throw new RuntimeException(e2);
}
}
this.continuations = null;
}
}
/* access modifiers changed from: package-private */
public boolean trySetCancelled() {
synchronized (this.lock) {
if (this.complete) {
return false;
}
this.complete = true;
this.cancelled = true;
this.lock.notifyAll();
runContinuations();
return true;
}
}
/* access modifiers changed from: package-private */
public boolean trySetResult(TResult tresult) {
synchronized (this.lock) {
if (this.complete) {
return false;
}
this.complete = true;
this.result = tresult;
this.lock.notifyAll();
runContinuations();
return true;
}
}
/* access modifiers changed from: package-private */
/* JADX WARNING: Code restructure failed: missing block: B:13:0x002b, code lost:
return true;
*/
/* Code decompiled incorrectly, please refer to instructions dump. */
public boolean trySetError(java.lang.Exception r4) {
/*
r3 = this;
java.lang.Object r0 = r3.lock
monitor-enter(r0)
boolean r1 = r3.complete // Catch:{ all -> 0x002c }
r2 = 0
if (r1 == 0) goto L_0x000a
monitor-exit(r0) // Catch:{ all -> 0x002c }
return r2
L_0x000a:
r1 = 1
r3.complete = r1 // Catch:{ all -> 0x002c }
r3.error = r4 // Catch:{ all -> 0x002c }
r3.errorHasBeenObserved = r2 // Catch:{ all -> 0x002c }
java.lang.Object r4 = r3.lock // Catch:{ all -> 0x002c }
r4.notifyAll() // Catch:{ all -> 0x002c }
r3.runContinuations() // Catch:{ all -> 0x002c }
boolean r4 = r3.errorHasBeenObserved // Catch:{ all -> 0x002c }
if (r4 != 0) goto L_0x002a
bolts.Task$UnobservedExceptionHandler r4 = getUnobservedExceptionHandler() // Catch:{ all -> 0x002c }
if (r4 == 0) goto L_0x002a
bolts.UnobservedErrorNotifier r4 = new bolts.UnobservedErrorNotifier // Catch:{ all -> 0x002c }
r4.<init>(r3) // Catch:{ all -> 0x002c }
r3.unobservedErrorNotifier = r4 // Catch:{ all -> 0x002c }
L_0x002a:
monitor-exit(r0) // Catch:{ all -> 0x002c }
return r1
L_0x002c:
r4 = move-exception
monitor-exit(r0) // Catch:{ all -> 0x002c }
throw r4
*/
throw new UnsupportedOperationException("Method not decompiled: bolts.Task.trySetError(java.lang.Exception):boolean");
}
public class TaskCompletionSource extends TaskCompletionSource<TResult> {
TaskCompletionSource() {
}
}
}
Download file