VancedMicroG/play-services-tasks/src/main/java/com/google/android/gms/tasks/TaskCompletionSource.java

95 lines
2.8 KiB
Java

/*
* SPDX-FileCopyrightText: 2016, microG Project Team
* SPDX-License-Identifier: Apache-2.0 AND CC-BY-4.0
* Notice: Portions of this file are reproduced from work created and shared by Google and used
* according to terms described in the Creative Commons 4.0 Attribution License.
* See https://developers.google.com/readme/policies for details.
*/
package com.google.android.gms.tasks;
import org.microg.gms.common.PublicApi;
import org.microg.gms.tasks.TaskImpl;
/**
* Provides the ability to create an incomplete {@link Task} and later complete it by either
* calling {@link #setResult(TResult)} or {@link #setException(Exception)}.
*/
@PublicApi
public class TaskCompletionSource<TResult> {
private TaskImpl<TResult> task = new TaskImpl<>();
/**
* Creates an instance of {@link TaskCompletionSource}.
*/
public TaskCompletionSource() {
}
/**
* Creates an instance of {@link TaskCompletionSource} with a {@link CancellationToken} so that the Task can be set to canceled when {@link CancellationToken} is canceled.
*/
public TaskCompletionSource(CancellationToken token) {
token.onCanceledRequested(() -> {
try {
task.cancel();
} catch (DuplicateTaskCompletionException ignored) {
}
});
}
/**
* Returns the Task.
*/
public Task<TResult> getTask() {
return task;
}
/**
* Completes the Task with the specified exception.
*
* @throws IllegalStateException if the Task is already complete
*/
public void setException(Exception e) {
task.setException(e);
}
/**
* Completes the Task with the specified exception, unless the Task has already completed.
* If the Task has already completed, the call does nothing.
*
* @return {@code true} if the exception was set successfully, {@code false} otherwise
*/
public boolean trySetException(Exception e) {
try {
setException(e);
return true;
} catch (DuplicateTaskCompletionException ignored) {
return false;
}
}
/**
* Completes the Task with the specified result.
*
* @throws IllegalStateException if the Task is already complete
*/
public void setResult(TResult result) {
task.setResult(result);
}
/**
* Completes the Task with the specified result, unless the Task has already completed.
* If the Task has already completed, the call does nothing.
*
* @return {@code true} if the result was set successfully, {@code false} otherwise
*/
public boolean trySetResult(TResult result) {
try {
setResult(result);
return true;
} catch (DuplicateTaskCompletionException ignored) {
return false;
}
}
}