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 { public enum Status { SUCCESS, FAILED } private final BlockingQueue blockingQueue; private final List> 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 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... 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 { void onFinished(Status status, R result); } }