package com.tresorit.zerokit.call; import android.os.Handler; import android.os.Looper; import com.tresorit.zerokit.util.Holder; import java.util.concurrent.CountDownLatch; public class CallAction<T, S> extends CallAsyncAction<T, S> implements Call<T, S> { public CallAction(ActionCallback<T, S> action) { super(action); } private void call(final Callback<? super T, ? super S> callback, boolean sync) { if (sync) action.call(callback); else { if (Looper.myLooper() == null) throw new IllegalStateException("Asynchronous method only possible from looper threads."); final Handler handler = new Handler(Looper.myLooper()); action.call(new Callback<T, S>() { @Override public void onSuccess(final T result) { handler.post(new Runnable() { @Override public void run() { callback.onSuccess(result); } }); } @Override public void onError(final S e) { handler.post(new Runnable() { @Override public void run() { callback.onError(e); } }); } }); } } @Override public final void enqueue(final Callback<? super T, ? super S> callback) { call(callback, false); } @Override public final Response<T, S> execute() { final Holder<Response<T, S>> result = new Holder<>(); final CountDownLatch signal = new CountDownLatch(1); call(new Callback<T, S>() { @Override public void onSuccess(T t) { result.t = Response.fromValue(t); signal.countDown(); } @Override public void onError(S e) { result.t = Response.fromError(e); signal.countDown(); } }, true); if (signal.getCount() > 0) try { signal.await(); } catch (InterruptedException e) { e.printStackTrace(); } return result.t; } }