Android: Re-implement a subset of CompletableFuture
Imagine if Android phones actually got updates
This commit is contained in:
parent
347551a01d
commit
12aa1071cb
|
@ -19,12 +19,12 @@ import org.dolphinemu.dolphinemu.model.GameFileCache;
|
||||||
import org.dolphinemu.dolphinemu.services.GameFileCacheService;
|
import org.dolphinemu.dolphinemu.services.GameFileCacheService;
|
||||||
import org.dolphinemu.dolphinemu.utils.AfterDirectoryInitializationRunner;
|
import org.dolphinemu.dolphinemu.utils.AfterDirectoryInitializationRunner;
|
||||||
import org.dolphinemu.dolphinemu.utils.BooleanSupplier;
|
import org.dolphinemu.dolphinemu.utils.BooleanSupplier;
|
||||||
|
import org.dolphinemu.dolphinemu.utils.CompletableFuture;
|
||||||
import org.dolphinemu.dolphinemu.utils.ContentHandler;
|
import org.dolphinemu.dolphinemu.utils.ContentHandler;
|
||||||
import org.dolphinemu.dolphinemu.utils.FileBrowserHelper;
|
import org.dolphinemu.dolphinemu.utils.FileBrowserHelper;
|
||||||
import org.dolphinemu.dolphinemu.utils.WiiUtils;
|
import org.dolphinemu.dolphinemu.utils.WiiUtils;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.concurrent.CompletableFuture;
|
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
@ -171,9 +171,6 @@ public final class MainPresenter
|
||||||
|
|
||||||
public void importWiiSave(String path)
|
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;
|
final Activity mainPresenterActivity = (Activity) mContext;
|
||||||
|
|
||||||
CompletableFuture<Boolean> canOverwriteFuture = new CompletableFuture<>();
|
CompletableFuture<Boolean> canOverwriteFuture = new CompletableFuture<>();
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue