From 86fc518585b15bded91e1cc06f867cae740ac1a0 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Thu, 12 Mar 2020 01:13:24 -0600 Subject: [PATCH] tunnel: replace CompletableFuture with GhettoCompletableFuture Signed-off-by: Jason A. Donenfeld --- tunnel/build.gradle | 1 - .../wireguard/android/backend/GoBackend.java | 35 +++++++++++++++++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/tunnel/build.gradle b/tunnel/build.gradle index 9911b0d9..6a2e1c0e 100644 --- a/tunnel/build.gradle +++ b/tunnel/build.gradle @@ -25,7 +25,6 @@ android { dependencies { api "net.sourceforge.streamsupport:android-retrostreams:$streamsupportVersion" - implementation "net.sourceforge.streamsupport:android-retrofuture:$streamsupportVersion" implementation "androidx.annotation:annotation:$annotationsVersion" implementation "androidx.collection:collection:$collectionVersion" implementation "com.google.code.findbugs:jsr305:$jsr305Version" diff --git a/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java b/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java index 6d3d65cb..978b39aa 100644 --- a/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java +++ b/tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java @@ -24,18 +24,20 @@ import com.wireguard.util.NonNullForAll; import java.net.InetAddress; import java.util.Collections; import java.util.Set; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.FutureTask; +import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import androidx.annotation.Nullable; import androidx.collection.ArraySet; -import java9.util.concurrent.CompletableFuture; @NonNullForAll public final class GoBackend implements Backend { private static final String TAG = "WireGuard/" + GoBackend.class.getSimpleName(); @Nullable private static AlwaysOnCallback alwaysOnCallback; - private static CompletableFuture vpnService = new CompletableFuture<>(); + private static GhettoCompletableFuture vpnService = new GhettoCompletableFuture<>(); private final Context context; @Nullable private Config currentConfig; @Nullable private Tunnel currentTunnel; @@ -247,6 +249,35 @@ public final class GoBackend implements Backend { void alwaysOnTriggered(); } + // TODO: When we finally drop API 21 and move to API 24, delete this and replace with the ordinary CompletableFuture. + private static final class GhettoCompletableFuture { + private final LinkedBlockingQueue completion = new LinkedBlockingQueue<>(1); + private final FutureTask result = new FutureTask<>(completion::peek); + + public boolean complete(final V value) { + final boolean offered = completion.offer(value); + if (offered) + result.run(); + return offered; + } + + public V get() throws ExecutionException, InterruptedException { + return result.get(); + } + + public V get(final long timeout, final TimeUnit unit) throws ExecutionException, InterruptedException, TimeoutException { + return result.get(timeout, unit); + } + + public boolean isDone() { + return !completion.isEmpty(); + } + + public GhettoCompletableFuture newIncompleteFuture() { + return new GhettoCompletableFuture<>(); + } + } + public static class VpnService extends android.net.VpnService { @Nullable private GoBackend owner;