From dd5f8312627a5bf4b5a0f311437baa681ecdfbbd Mon Sep 17 00:00:00 2001 From: Simonx22 Date: Fri, 21 Nov 2025 21:47:09 -0500 Subject: [PATCH] Android: Remove CompletableFuture We only use this class in one in one single function since its introduction with 12aa1071cbb30269cd6526cfbbcd3c4143d584ac in 2021. If we do need it elsewhere we can always bring it back. --- .../dolphinemu/ui/main/MainPresenter.kt | 19 ++-- .../dolphinemu/utils/CompletableFuture.java | 97 ------------------- 2 files changed, 10 insertions(+), 106 deletions(-) delete mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/CompletableFuture.java diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.kt index cea17578d4..77a7dcaa8a 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.kt @@ -26,7 +26,6 @@ import org.dolphinemu.dolphinemu.model.GameFileCache import org.dolphinemu.dolphinemu.services.GameFileCacheManager 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.DirectoryInitialization import org.dolphinemu.dolphinemu.utils.FileBrowserHelper @@ -34,7 +33,8 @@ import org.dolphinemu.dolphinemu.utils.PermissionsHandler import org.dolphinemu.dolphinemu.utils.ThreadUtil import org.dolphinemu.dolphinemu.utils.WiiUtils import java.util.Arrays -import java.util.concurrent.ExecutionException +import java.util.concurrent.CountDownLatch +import java.util.concurrent.atomic.AtomicReference class MainPresenter(private val mainView: MainView, private val activity: FragmentActivity) { private var dirToAdd: String? = null @@ -265,33 +265,34 @@ class MainPresenter(private val mainView: MainView, private val activity: Fragme } fun importWiiSave(path: String?) { - val canOverwriteFuture = CompletableFuture() ThreadUtil.runOnThreadAndShowResult( activity, R.string.import_in_progress, 0, { val canOverwrite = BooleanSupplier { + val latch = CountDownLatch(1) + val decision = AtomicReference() activity.runOnUiThread { MaterialAlertDialogBuilder(activity) .setMessage(R.string.wii_save_exists) .setCancelable(false) .setPositiveButton(R.string.yes) { _: DialogInterface?, _: Int -> - canOverwriteFuture.complete(true) + decision.set(true) + latch.countDown() } .setNegativeButton(R.string.no) { _: DialogInterface?, _: Int -> - canOverwriteFuture.complete(false) + decision.set(false) + latch.countDown() } .show() } try { - return@BooleanSupplier canOverwriteFuture.get() - } catch (e: ExecutionException) { - // Shouldn't happen - throw RuntimeException(e) + latch.await() } catch (e: InterruptedException) { throw RuntimeException(e) } + decision.get() ?: false } val message: Int = when (WiiUtils.importWiiSave(path!!, canOverwrite)) { 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 deleted file mode 100644 index 1b3c450534..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/CompletableFuture.java +++ /dev/null @@ -1,97 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later - -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 implements Future -{ - 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(); - } - } -}