GitNex-Android-App/app/src/main/java/org/mian/gitnex/actions/ActionResult.java

79 lines
1.6 KiB
Java

package org.mian.gitnex.actions;
import androidx.annotation.NonNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
/**
* @author opyale
*/
public class ActionResult<R> {
private final BlockingQueue<Boolean> blockingQueue;
private final List<OnFinishedListener<R>> onFinishedListeners;
private boolean invalidated = false;
public ActionResult() {
blockingQueue = new ArrayBlockingQueue<>(1);
onFinishedListeners = new ArrayList<>();
}
public void finish(@NonNull Status status) {
finish(status, null);
}
public void finish(@NonNull Status status, R result) {
try {
if (blockingQueue.poll(5, TimeUnit.SECONDS)) {
for (OnFinishedListener<R> onFinishedListener : onFinishedListeners)
onFinishedListener.onFinished(status, result);
}
} catch (InterruptedException ignored) {
}
}
public void invalidate() {
if (invalidated) {
throw new IllegalStateException("Already invalidated");
}
this.invalidated = true;
}
@SafeVarargs
public final synchronized void accept(@NonNull OnFinishedListener<R>... onFinishedListeners) {
invalidate();
this.blockingQueue.add(true);
this.onFinishedListeners.addAll(Arrays.asList(onFinishedListeners));
}
public final synchronized void discard() {
invalidate();
this.blockingQueue.add(false);
}
public enum Status {
SUCCESS,
FAILED
}
public interface OnFinishedListener<R> {
void onFinished(Status status, R result);
}
public static class None {}
}