mirror of
https://codeberg.org/gitnex/GitNex.git
synced 2023-12-13 20:50:18 +01:00
81 lines
1.6 KiB
Java
81 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> {
|
||
|
|
||
|
public enum Status { SUCCESS, FAILED }
|
||
|
|
||
|
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 synchronized final void accept(@NonNull OnFinishedListener<R>... onFinishedListeners) {
|
||
|
|
||
|
invalidate();
|
||
|
|
||
|
this.blockingQueue.add(true);
|
||
|
this.onFinishedListeners.addAll(Arrays.asList(onFinishedListeners));
|
||
|
|
||
|
}
|
||
|
|
||
|
public synchronized final void discard() {
|
||
|
|
||
|
invalidate();
|
||
|
this.blockingQueue.add(false);
|
||
|
|
||
|
}
|
||
|
|
||
|
public static class None {}
|
||
|
|
||
|
public interface OnFinishedListener<R> {
|
||
|
|
||
|
void onFinished(Status status, R result);
|
||
|
}
|
||
|
|
||
|
}
|