summaryrefslogtreecommitdiff
path: root/Source/Android/app/src
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2021-01-18 13:06:40 +0100
committerJosJuice <josjuice@gmail.com>2021-01-27 20:10:07 +0100
commit12aa1071cbb30269cd6526cfbbcd3c4143d584ac (patch)
treea072f61487f5a1ed1d2571f9588e96c7c7ced1c4 /Source/Android/app/src
parent347551a01da643980fabfd3579ec34bb6cbb5419 (diff)
Android: Re-implement a subset of CompletableFuture
Imagine if Android phones actually got updates
Diffstat (limited to 'Source/Android/app/src')
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.java5
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/CompletableFuture.java95
2 files changed, 96 insertions, 4 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.java
index 1534b0c654..ebd43513ab 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.java
@@ -19,12 +19,12 @@ import org.dolphinemu.dolphinemu.model.GameFileCache;
import org.dolphinemu.dolphinemu.services.GameFileCacheService;
import org.dolphinemu.dolphinemu.utils.AfterDirectoryInitializationRunner;
import org.dolphinemu.dolphinemu.utils.BooleanSupplier;
+import org.dolphinemu.dolphinemu.utils.CompletableFuture;
import org.dolphinemu.dolphinemu.utils.ContentHandler;
import org.dolphinemu.dolphinemu.utils.FileBrowserHelper;
import org.dolphinemu.dolphinemu.utils.WiiUtils;
import java.util.Arrays;
-import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.function.Supplier;
@@ -171,9 +171,6 @@ public final class MainPresenter
public void importWiiSave(String path)
{
- if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.N)
- return; // TODO
-
final Activity mainPresenterActivity = (Activity) mContext;
CompletableFuture<Boolean> canOverwriteFuture = new CompletableFuture<>();
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/CompletableFuture.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/CompletableFuture.java
new file mode 100644
index 0000000000..bdd1b02faf
--- /dev/null
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/CompletableFuture.java
@@ -0,0 +1,95 @@
+package org.dolphinemu.dolphinemu.utils;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * Simplified re-implementation of a subset of {@link java.util.concurrent.CompletableFuture}.
+ * Replace this class with that class once we have full Java 8 support (once we require API 24).
+ */
+public class CompletableFuture<T> implements Future<T>
+{
+ private final Lock lock = new ReentrantLock();
+ private final Condition done = lock.newCondition();
+
+ private boolean isDone = false;
+ private T result = null;
+
+ @Override
+ public boolean cancel(boolean mayInterruptIfRunning)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean isCancelled()
+ {
+ return false;
+ }
+
+ @Override
+ public boolean isDone()
+ {
+ return isDone;
+ }
+
+ @Override
+ public T get() throws ExecutionException, InterruptedException
+ {
+ lock.lock();
+ try
+ {
+ while (!isDone)
+ done.await();
+
+ return result;
+ }
+ finally
+ {
+ lock.unlock();
+ }
+ }
+
+ @Override
+ public T get(long timeout, TimeUnit unit)
+ throws ExecutionException, InterruptedException, TimeoutException
+ {
+ lock.lock();
+ try
+ {
+ while (!isDone)
+ {
+ if (!done.await(timeout, unit))
+ throw new TimeoutException();
+ }
+
+ return result;
+ }
+ finally
+ {
+ lock.unlock();
+ }
+ }
+
+ public boolean complete(T value)
+ {
+ lock.lock();
+ try
+ {
+ boolean wasDone = isDone;
+ result = value;
+ isDone = true;
+ done.signalAll();
+ return !wasDone;
+ }
+ finally
+ {
+ lock.unlock();
+ }
+ }
+}