aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/app/src/main/java/com/wireguard/android/util/AsyncWorker.java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/com/wireguard/android/util/AsyncWorker.java')
-rw-r--r--app/src/main/java/com/wireguard/android/util/AsyncWorker.java65
1 files changed, 65 insertions, 0 deletions
diff --git a/app/src/main/java/com/wireguard/android/util/AsyncWorker.java b/app/src/main/java/com/wireguard/android/util/AsyncWorker.java
new file mode 100644
index 00000000..5f9f0a83
--- /dev/null
+++ b/app/src/main/java/com/wireguard/android/util/AsyncWorker.java
@@ -0,0 +1,65 @@
+package com.wireguard.android.util;
+
+import android.os.Handler;
+
+import com.wireguard.android.Application.ApplicationHandler;
+import com.wireguard.android.Application.ApplicationScope;
+
+import java.util.concurrent.Executor;
+
+import javax.inject.Inject;
+
+import java9.util.concurrent.CompletableFuture;
+import java9.util.concurrent.CompletionStage;
+
+/**
+ * Helper class for running asynchronous tasks and ensuring they are completed on the main thread.
+ */
+
+@ApplicationScope
+public class AsyncWorker {
+ private final Executor executor;
+ private final Handler handler;
+
+ @Inject
+ public AsyncWorker(final Executor executor, @ApplicationHandler final Handler handler) {
+ this.executor = executor;
+ this.handler = handler;
+ }
+
+ public CompletionStage<Void> runAsync(final AsyncRunnable<?> runnable) {
+ final CompletableFuture<Void> future = new CompletableFuture<>();
+ executor.execute(() -> {
+ try {
+ runnable.run();
+ handler.post(() -> future.complete(null));
+ } catch (final Throwable t) {
+ handler.post(() -> future.completeExceptionally(t));
+ }
+ });
+ return future;
+ }
+
+ public <T> CompletionStage<T> supplyAsync(final AsyncSupplier<T, ?> supplier) {
+ final CompletableFuture<T> future = new CompletableFuture<>();
+ executor.execute(() -> {
+ try {
+ final T result = supplier.get();
+ handler.post(() -> future.complete(result));
+ } catch (final Throwable t) {
+ handler.post(() -> future.completeExceptionally(t));
+ }
+ });
+ return future;
+ }
+
+ @FunctionalInterface
+ public interface AsyncRunnable<E extends Throwable> {
+ void run() throws E;
+ }
+
+ @FunctionalInterface
+ public interface AsyncSupplier<T, E extends Throwable> {
+ T get() throws E;
+ }
+}