|
|
|
@ -40,9 +40,9 @@ public class CameraOrchestrator { |
|
|
|
|
|
|
|
|
|
protected static class Token { |
|
|
|
|
public final String name; |
|
|
|
|
public final Task<Void> task; |
|
|
|
|
public final Task<?> task; |
|
|
|
|
|
|
|
|
|
private Token(@NonNull String name, @NonNull Task<Void> task) { |
|
|
|
|
private Token(@NonNull String name, @NonNull Task<?> task) { |
|
|
|
|
this.name = name; |
|
|
|
|
this.task = task; |
|
|
|
|
} |
|
|
|
@ -76,28 +76,29 @@ public class CameraOrchestrator { |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@SuppressWarnings("unchecked") |
|
|
|
|
@NonNull |
|
|
|
|
public Task<Void> schedule(@NonNull final String name, |
|
|
|
|
final boolean dispatchExceptions, |
|
|
|
|
@NonNull final Callable<Task<Void>> job) { |
|
|
|
|
public <T> Task<T> schedule(@NonNull final String name, |
|
|
|
|
final boolean dispatchExceptions, |
|
|
|
|
@NonNull final Callable<Task<T>> job) { |
|
|
|
|
LOG.i(name.toUpperCase(), "- Scheduling."); |
|
|
|
|
final TaskCompletionSource<Void> source = new TaskCompletionSource<>(); |
|
|
|
|
final TaskCompletionSource<T> source = new TaskCompletionSource<>(); |
|
|
|
|
final WorkerHandler handler = mCallback.getJobWorker(name); |
|
|
|
|
synchronized (mLock) { |
|
|
|
|
applyCompletionListener(mJobs.getLast().task, handler, |
|
|
|
|
new OnCompleteListener<Void>() { |
|
|
|
|
new OnCompleteListener() { |
|
|
|
|
@Override |
|
|
|
|
public void onComplete(@NonNull Task<Void> task) { |
|
|
|
|
public void onComplete(@NonNull Task task) { |
|
|
|
|
synchronized (mLock) { |
|
|
|
|
mJobs.removeFirst(); |
|
|
|
|
ensureToken(); |
|
|
|
|
} |
|
|
|
|
try { |
|
|
|
|
LOG.i(name.toUpperCase(), "- Executing."); |
|
|
|
|
Task<Void> inner = job.call(); |
|
|
|
|
applyCompletionListener(inner, handler, new OnCompleteListener<Void>() { |
|
|
|
|
Task<T> inner = job.call(); |
|
|
|
|
applyCompletionListener(inner, handler, new OnCompleteListener<T>() { |
|
|
|
|
@Override |
|
|
|
|
public void onComplete(@NonNull Task<Void> task) { |
|
|
|
|
public void onComplete(@NonNull Task<T> task) { |
|
|
|
|
Exception e = task.getException(); |
|
|
|
|
if (e != null) { |
|
|
|
|
LOG.w(name.toUpperCase(), "- Finished with ERROR.", e); |
|
|
|
@ -110,7 +111,7 @@ public class CameraOrchestrator { |
|
|
|
|
source.trySetException(new CancellationException()); |
|
|
|
|
} else { |
|
|
|
|
LOG.i(name.toUpperCase(), "- Finished."); |
|
|
|
|
source.trySetResult(null); |
|
|
|
|
source.trySetResult(task.getResult()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
@ -153,7 +154,7 @@ public class CameraOrchestrator { |
|
|
|
|
mCallback.getJobWorker(name).remove(mDelayedJobs.get(name)); |
|
|
|
|
mDelayedJobs.remove(name); |
|
|
|
|
} |
|
|
|
|
Token token = new Token(name, Tasks.<Void>forResult(null)); |
|
|
|
|
Token token = new Token(name, Tasks.forResult(null)); |
|
|
|
|
//noinspection StatementWithEmptyBody
|
|
|
|
|
while (mJobs.remove(token)) { /* do nothing */ } |
|
|
|
|
ensureToken(); |
|
|
|
@ -163,14 +164,14 @@ public class CameraOrchestrator { |
|
|
|
|
private void ensureToken() { |
|
|
|
|
synchronized (mLock) { |
|
|
|
|
if (mJobs.isEmpty()) { |
|
|
|
|
mJobs.add(new Token("BASE", Tasks.<Void>forResult(null))); |
|
|
|
|
mJobs.add(new Token("BASE", Tasks.forResult(null))); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private static void applyCompletionListener(@NonNull final Task<Void> task, |
|
|
|
|
@NonNull WorkerHandler handler, |
|
|
|
|
@NonNull final OnCompleteListener<Void> listener) { |
|
|
|
|
private static <T> void applyCompletionListener(@NonNull final Task<T> task, |
|
|
|
|
@NonNull WorkerHandler handler, |
|
|
|
|
@NonNull final OnCompleteListener<T> listener) { |
|
|
|
|
if (task.isComplete()) { |
|
|
|
|
handler.run(new Runnable() { |
|
|
|
|
@Override |
|
|
|
|